listen for data on a socket. Returns a pair of the number of packets received and the number of bytes received. If both are -1, connecting to socket failed.
85 if(tim::socket::manager::init() != 0)
87 std::cerr <<
"Can't start socket!" << std::endl;
91 socket_t _listening = ::socket(AF_INET, SOCK_STREAM, 0);
92 if(_listening == invalid_socket)
94 std::cerr <<
"Can't create a socket!" << std::endl;
99 _hint.sin_family = AF_INET;
100 _hint.sin_port = htons(_port);
101#if defined(TIMEMORY_WINDOWS)
102 _hint.sin_addr.S_un.S_addr = INADDR_ANY;
104 _hint.sin_addr.s_addr = INADDR_ANY;
107 ::bind(_listening, (sockaddr*) &_hint,
sizeof(_hint));
111#if defined(TIMEMORY_WINDOWS)
112 int _client_size =
sizeof(_client);
114 unsigned int _client_size =
sizeof(_client);
116 socket_t _client_socket = accept(_listening, (sockaddr*) &_client, &_client_size);
117 m_server_sockets[_channel_name] = _client_socket;
118 char _host[NI_MAXHOST];
119 char _service[NI_MAXSERV];
121 memset(_host, 0, NI_MAXHOST);
122 memset(_service, 0, NI_MAXSERV);
123 if(getnameinfo((sockaddr*) &_client,
sizeof(_client), _host, NI_MAXHOST, _service,
126 std::cout << _host <<
" connected on port " << _service << std::endl;
130 inet_ntop(AF_INET, &_client.sin_addr, _host, NI_MAXHOST);
131 std::cout << _host <<
" connected on port " << ntohs(_client.sin_port)
141 int _bytes_recv = ::recv(_client_socket, _buff,
buffer_size, 0);
144 if(_bytes_recv == socket_error)
146 std::cerr <<
"Error in recv(). Quitting" << std::endl;
153 _nrecv.second += _bytes_recv;
155 if(_max_packets > 0 && _nrecv.first >= _max_packets)
157 std::cerr <<
"Maximum number of packages received: " << _max_packets
158 <<
". Quitting" << std::endl;
169 tim::socket::manager::quit();
auto listen(const std::string &_channel_name, int _port, CallbackT &&callback, int64_t _max_packets=0) -> decltype(callback(_channel_name), listen_info_t{})
listen for data on a socket. Returns a pair of the number of packets received and the number of bytes...
std::pair< int64_t, int64_t > listen_info_t
static constexpr int buffer_size
tim::mpl::apply< std::string > string