Electroneum
epee::net_utils::abstract_tcp_server< THandler > Class Template Reference

#include <abstract_tcp_server.h>

Public Member Functions

 abstract_tcp_server ()
 
bool init_server (int port_no)
 
bool deinit_server ()
 
bool run_server ()
 
bool send_stop_signal ()
 
THandler::config_type & get_config_object ()
 

Detailed Description

template<class THandler>
class epee::net_utils::abstract_tcp_server< THandler >

Definition at line 77 of file abstract_tcp_server.h.

Constructor & Destructor Documentation

◆ abstract_tcp_server()

template<class THandler >
epee::net_utils::abstract_tcp_server< THandler >::abstract_tcp_server ( )

Definition at line 162 of file abstract_tcp_server.h.

163  m_initialized(false),
164  m_stop_server(0), m_port(0), m_threads_count(0)
165  {
166 
167  }
#define INVALID_SOCKET

Member Function Documentation

◆ deinit_server()

template<class THandler >
bool epee::net_utils::abstract_tcp_server< THandler >::deinit_server ( )

Definition at line 215 of file abstract_tcp_server.h.

216  {
217 
218  if(!m_initialized)
219  return true;
220 
222  {
223  shutdown(m_listen_socket, SD_BOTH);
224  int res = closesocket(m_listen_socket);
225  if(SOCKET_ERROR == res)
226  {
227  int err = ::WSAGetLastError();
228  LOG_ERROR("Failed to closesocket(), err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"");
229  }
231  }
232 
233  int res = ::WSACleanup();
234  if(SOCKET_ERROR == res)
235  {
236  int err = ::WSAGetLastError();
237  LOG_ERROR("Failed to WSACleanup(), err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"");
238  }
239  m_initialized = false;
240 
241  return true;
242  }
const char * res
Definition: hmac_keccak.cpp:41
#define INVALID_SOCKET
#define LOG_ERROR(x)
Definition: misc_log_ex.h:98

◆ get_config_object()

template<class THandler >
THandler::config_type& epee::net_utils::abstract_tcp_server< THandler >::get_config_object ( )
inline

Definition at line 87 of file abstract_tcp_server.h.

87 {return m_config;}
TProtocol::config_type m_config

◆ init_server()

template<class THandler >
bool epee::net_utils::abstract_tcp_server< THandler >::init_server ( int  port_no)

Definition at line 171 of file abstract_tcp_server.h.

172  {
173  m_port = port_no;
174  WSADATA wsad = {0};
175  int err = ::WSAStartup(MAKEWORD(2,2), &wsad);
176  if ( err != 0 || LOBYTE( wsad.wVersion ) != 2 || HIBYTE( wsad.wVersion ) != 2 )
177  {
178  LOG_ERROR("Could not find a usable WinSock DLL, err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"");
179  return false;
180  }
181 
182  m_initialized = true;
183 
184  m_listen_socket = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
186  {
187  err = ::WSAGetLastError();
188  LOG_ERROR("Failed to create socket, err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"");
189  return false;
190  }
191 
192  int opt = 1;
193  setsockopt (m_listen_socket, SOL_SOCKET,SO_REUSEADDR, reinterpret_cast<char*>(&opt), sizeof(int));
194 
195  sockaddr_in adr = {0};
196  adr.sin_family = AF_INET;
197  adr.sin_addr.s_addr = htonl(INADDR_ANY);
198  adr.sin_port = (u_short)htons(port_no);
199 
200  err = bind(m_listen_socket, (const sockaddr*)&adr, sizeof(adr ));
201  if(SOCKET_ERROR == err )
202  {
203  err = ::WSAGetLastError();
204  LOG_PRINT("Failed to Bind, err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"", LOG_LEVEL_2);
205  deinit_server();
206  return false;
207  }
208 
209  ::InterlockedExchange(&m_stop_server, 0);
210 
211  return true;
212  }
#define INVALID_SOCKET
#define LOG_ERROR(x)
Definition: misc_log_ex.h:98

◆ run_server()

template<class THandler >
bool epee::net_utils::abstract_tcp_server< THandler >::run_server ( )

Definition at line 252 of file abstract_tcp_server.h.

253  {
254  int err = listen(m_listen_socket, 10000);
255  if(SOCKET_ERROR == err )
256  {
257  err = ::WSAGetLastError();
258  LOG_ERROR("Failed to listen, err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"");
259  return false;
260  }
261 
262  LOG_PRINT("Listening port "<< m_port << "...." , LOG_LEVEL_2);
263 
264  while(!m_stop_server)
265  {
266  sockaddr_in adr_from = {0};
267  int adr_len = sizeof(adr_from);
268  fd_set read_fs = {0};
269  read_fs.fd_count = 1;
270  read_fs.fd_array[0] = m_listen_socket;
271  TIMEVAL tv = {0};
272  tv.tv_usec = 100;
273  int select_res = select(0, &read_fs, NULL, NULL, &tv);
274  if(!select_res)
275  continue;
276  SOCKET new_sock = WSAAccept(m_listen_socket, (sockaddr *)&adr_from, &adr_len, NULL, NULL);
277  LOG_PRINT("Accepted connection on socket=" << new_sock, LOG_LEVEL_2);
278  invoke_connection(new_sock, adr_from.sin_addr.s_addr, adr_from.sin_port);
279  }
280 
281  deinit_server();
282 
283 #define ABSTR_TCP_SRV_WAIT_COUNT_MAX 5000
284 #define ABSTR_TCP_SRV_WAIT_COUNT_INTERVAL 1000
285 
286  int wait_count = 0;
287 
288  while(m_threads_count && wait_count*1000 < ABSTR_TCP_SRV_WAIT_COUNT_MAX)
289  {
291  wait_count++;
292  }
293  LOG_PRINT("abstract_tcp_server exit with wait count=" << wait_count*ABSTR_TCP_SRV_WAIT_COUNT_INTERVAL << "(max=" << ABSTR_TCP_SRV_WAIT_COUNT_MAX <<")", LOG_LEVEL_0);
294 
295  return true;
296  }
#define SOCKET
#define ABSTR_TCP_SRV_WAIT_COUNT_INTERVAL
#define LOG_ERROR(x)
Definition: misc_log_ex.h:98
#define ABSTR_TCP_SRV_WAIT_COUNT_MAX

◆ send_stop_signal()

template<class THandler >
bool epee::net_utils::abstract_tcp_server< THandler >::send_stop_signal ( )

Definition at line 245 of file abstract_tcp_server.h.

246  {
247  InterlockedExchange(&m_stop_server, 1);
248  return true;
249  }

The documentation for this class was generated from the following file: