Electroneum
Loading...
Searching...
No Matches
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.

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
221 if(INVALID_SOCKET != m_listen_socket)
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 }
230 m_listen_socket = INVALID_SOCKET;
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 }
#define LOG_ERROR(x)
Definition misc_log_ex.h:98
Here is the caller graph for this function:

◆ 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;}

◆ 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);
185 if(INVALID_SOCKET == m_listen_socket)
186 {
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 {
204 LOG_PRINT("Failed to Bind, err = " << err << " \"" << socket_errors::get_socket_error_text(err) <<"\"", LOG_LEVEL_2);
206 return false;
207 }
208
209 ::InterlockedExchange(&m_stop_server, 0);
210
211 return true;
212 }
Here is the call graph for this function:

◆ 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 {
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
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 }
Here is the call graph for this function:

◆ 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:
  • /home/abuild/rpmbuild/BUILD/electroneum-5.1.3.1-build/electroneum-5.1.3.1/contrib/epee/include/net/abstract_tcp_server.h