50 sThread.RemoveThread(pthread_self());
56 bool ret = (
mSock !=
nullptr);
63 if (errbuf !=
nullptr)
70 _log(TCP_SERVER__ERROR,
"Open() - Listening socket already open" );
71 if (errbuf !=
nullptr)
83 unsigned int reuse_addr = 1;
84 mSock->
setopt( SOL_SOCKET, SO_REUSEADDR, &reuse_addr,
sizeof( reuse_addr ) );
88 sockaddr_in address = sockaddr_in();
89 memset( &address, 0,
sizeof( address ) );
90 address.sin_family = AF_INET;
91 address.sin_port = htons( port );
92 address.sin_addr.s_addr = htonl( INADDR_ANY );
94 if (
mSock->
bind((sockaddr*)&address,
sizeof(address)) < 0) {
95 _log(TCP_SERVER__ERROR,
"Open()::bind() < 0" );
102 unsigned int bufsize = 64 * 1024;
103 mSock->
setopt( SOL_SOCKET, SO_RCVBUF, &bufsize,
sizeof( bufsize ) );
106 _log(TCP_SERVER__ERROR,
"Open()::listen() failed, Error: %s", strerror( errno ) );
159 sockaddr_in from = sockaddr_in();
160 from.sin_family = AF_INET;
161 unsigned int fromlen =
sizeof( from );
164 while ((sock =
mSock->
accept((sockaddr*)&from, &fromlen))) {
165 sock->
fcntl( F_SETFL, O_NONBLOCK );
166 unsigned int bufsize = 64 * 1024;
167 sock->
setopt( SOL_SOCKET, SO_RCVBUF, &bufsize,
sizeof( bufsize ) );
176 assert( tcps !=
nullptr );
Simple wrapper for sockets.
#define _log(type, fmt,...)
int listen(int backlog=SOMAXCONN)
void WaitLoop()
Waits for worker thread to terminate.
void TCPServerLoop()
Loop for worker threads.
BaseTCPServer()
Creates empty TCP server.
A lock for a Lockable object.
int bind(const sockaddr *name, unsigned int namelen)
void Lock()
Locks the mutex.
const uint32 TCPSRV_LOOP_GRANULARITY
const uint32 TCPSRV_ERRBUF_SIZE
void SafeDelete(T *&p)
Deletes and nullifies a pointer.
void ListenNewConnections()
Accepts all new connections.
void Close()
Stops started listening.
bool Open(uint16 port, char *errbuf=0)
Start listening on specified port.
virtual ~BaseTCPServer()
Cleans server up.
int setopt(int level, int optname, const void *optval, unsigned int optlen)
void Unlock()
Unlocks the mutex.
Socket * accept(sockaddr *addr, unsigned int *addrlen)
virtual void CreateNewConnection(Socket *sock, uint32 rIP, uint16 rPort)=0
Processes new connection.
int fcntl(int cmd, long arg)
void StartLoop()
Starts worker thread.
static void * TCPServerLoop(void *arg)
Loop for worker threads.
Generic class for TCP server.
virtual bool Process()
Does periodical stuff to keep the server alive.