Program Listing for File tcp_socket.h
↰ Return to documentation for file (include/ur_client_library/comm/tcp_socket.h
)
/*
* Copyright 2019, FZI Forschungszentrum Informatik (refactor)
*
* Copyright 2017, 2018 Simon Rasmussen (refactor)
*
* Copyright 2015, 2016 Thomas Timm Andersen (original version)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <atomic>
#include <chrono>
#include <mutex>
#include <string>
#include <memory>
namespace urcl
{
namespace comm
{
enum class SocketState
{
Invalid,
Connected,
Disconnected,
Closed
};
class TCPSocket
{
private:
std::atomic<int> socket_fd_;
std::atomic<SocketState> state_;
std::chrono::milliseconds reconnection_time_;
bool reconnection_time_modified_deprecated_ = false;
void setupOptions();
protected:
static bool open(int socket_fd, struct sockaddr* address, size_t address_len)
{
return ::connect(socket_fd, address, address_len) == 0;
}
bool setup(const std::string& host, const int port, const size_t max_num_tries = 0,
const std::chrono::milliseconds reconnection_time = DEFAULT_RECONNECTION_TIME);
std::unique_ptr<timeval> recv_timeout_;
public:
static constexpr std::chrono::milliseconds DEFAULT_RECONNECTION_TIME{ 10000 };
TCPSocket();
virtual ~TCPSocket();
SocketState getState()
{
return state_;
}
int getSocketFD()
{
return socket_fd_;
}
std::string getIP() const;
bool read(char* character);
bool read(uint8_t* buf, const size_t buf_len, size_t& read);
bool write(const uint8_t* buf, const size_t buf_len, size_t& written);
void close();
void setReceiveTimeout(const timeval& timeout);
[[deprecated("Reconnection time is passed to setup directly now.")]] void
setReconnectionTime(const std::chrono::milliseconds reconnection_time);
};
} // namespace comm
} // namespace urcl