5 Client::Client(
const std::string& address,
const size_t& port) : _tmpMsg(), _fd(-1)
10 void Client::_networkError(std::string&& errorMsg)
13 errorMsg += strerror(errno);
14 errorMsg +=
" (errno: " + std::to_string(errno) +
")";
15 throw std::runtime_error(errorMsg);
22 _fd = ::socket(AF_INET, SOCK_STREAM, 0);
24 return _networkError(
"Cannot create socket");
27 sockaddr.sin_family = AF_INET;
28 sockaddr.sin_port = htons(port);
30 if (inet_pton(AF_INET, address.c_str(), &sockaddr.sin_addr) <= 0)
32 hostent* host = gethostbyname(address.c_str());
34 return _networkError(
"Cannot resolve hostname: " + address);
36 memcpy(&sockaddr.sin_addr, host->h_addr, host->h_length);
39 if (::
connect(_fd, (
struct sockaddr*)&sockaddr,
sizeof(sockaddr)) < 0)
40 return _networkError(
"Cannot connect to socket: ");
54 const std::function<
void(
const Message& msg)>& action)
56 _triggers[messageType].push_back(action);
62 ::send(_fd, data.data(), data.size(), 0);
65 bool Client::_isConnected()
const
71 socklen_t len =
sizeof(error);
74 return (getsockopt(_fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0 && error == 0);
77 void Client::_receiveMessage()
82 while ((bytes = recv(_fd, buffRead,
sizeof(buffRead), MSG_DONTWAIT)) > 0)
84 _tmpMsg.
appendBytes(
reinterpret_cast<unsigned char*
>(buffRead), bytes);
94 if (bytes == -1 && errno != EAGAIN && errno != EWOULDBLOCK)
97 if (errno == ENOTCONN ||
98 errno == ECONNRESET ||
106 _networkError(
"Cannot receive message: ");
123 _msgs.push_back(newMsg);
133 FD_ZERO(&_readyRead);
134 FD_SET(_fd, &_readyRead);
136 timeval timeout = {0, 10000};
138 int ready = select(_fd + 1, &_readyRead, NULL, NULL, &timeout);
139 if (ready <= 0 || !FD_ISSET(_fd, &_readyRead))
145 for (
auto& msg : _msgs)
147 auto it = _triggers.find(msg.type());
148 if (it == _triggers.end())
151 for (
auto& funct : it->second)
void connect(const std::string &address, const size_t &port)
void send(const Message &message)
void defineAction(const Message::Type &messageType, const std::function< void(const Message &msg)> &action)
const std::vector< unsigned char > data() const
Class representing a structured message for network communication.
std::vector< unsigned char > getSerializedData() const
void appendBytes(const unsigned char *data, size_t len)
void incr_cursor(size_t len) const