interim update while working TcpServer
This commit is contained in:
parent
d6b9e78114
commit
eb2755fa6b
@ -56,7 +56,6 @@ public:
|
||||
};
|
||||
|
||||
virtual int start (int* err_code = QSE_NULL) QSE_CPP_NOEXCEPT;
|
||||
virtual int start (bool winsock_inheritable, int* err_code = QSE_NULL) QSE_CPP_NOEXCEPT;
|
||||
virtual int stop () QSE_CPP_NOEXCEPT;
|
||||
|
||||
bool isServing () const QSE_CPP_NOEXCEPT
|
||||
@ -126,6 +125,11 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
class Listener: public QSE::Socket
|
||||
{
|
||||
Listener* next_listener;
|
||||
};
|
||||
|
||||
class Client: public QSE::Thread
|
||||
{
|
||||
public:
|
||||
@ -142,6 +146,9 @@ protected:
|
||||
SocketAddress address;
|
||||
};
|
||||
|
||||
Listener* listener_head;
|
||||
Listener* listener_tail;
|
||||
|
||||
SocketAddress binding_address;
|
||||
bool stop_requested;
|
||||
bool server_serving;
|
||||
@ -158,7 +165,7 @@ protected:
|
||||
private:
|
||||
void delete_dead_clients () QSE_CPP_NOEXCEPT;
|
||||
void delete_all_clients () QSE_CPP_NOEXCEPT;
|
||||
int open_tcp_socket (Socket& socket, bool winsock_inheritable, int* err_code) QSE_CPP_NOEXCEPT;
|
||||
int open_tcp_socket (Socket& socket, int* err_code) QSE_CPP_NOEXCEPT;
|
||||
};
|
||||
|
||||
|
||||
@ -213,6 +220,7 @@ public:
|
||||
{
|
||||
// TODO: are there any ways to achieve this without memory allocation?
|
||||
//this->__lfunc = new TCallable<T> (QSE_CPP_RVREF(f));
|
||||
// TODO: this->__lfunc = new TCallable<T> (QSE_CPP_RVREF(f));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -96,27 +96,18 @@ TcpServer::TcpServer (const SocketAddress& address):
|
||||
|
||||
TcpServer::~TcpServer () QSE_CPP_NOEXCEPT
|
||||
{
|
||||
// QSE_ASSERT (server_serving == false);
|
||||
// QSE_ASSERT (this->server_serving == false);
|
||||
this->delete_all_clients ();
|
||||
}
|
||||
|
||||
int TcpServer::start (int* err_code) QSE_CPP_NOEXCEPT
|
||||
int TcpServer::open_tcp_socket (Socket& socket, int* err_code) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
return this->start(true, err_code);
|
||||
}
|
||||
|
||||
int TcpServer::open_tcp_socket (Socket& socket, bool winsock_inheritable, int* err_code) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
if (socket.open(this->binding_address.getFamily(), QSE_SOCK_STREAM, 0) <= -1)
|
||||
if (socket.open(this->binding_address.getFamily(), QSE_SOCK_STREAM, Socket::T_CLOEXEC | Socket::T_NONBLOCK) <= -1)
|
||||
{
|
||||
if (err_code) *err_code = ERR_OPEN;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
SetHandleInformation ((HANDLE)socket.handle(), HANDLE_FLAG_INHERIT, (winsock_inheritable? HANDLE_FLAG_INHERIT: 0));
|
||||
#endif
|
||||
|
||||
//socket.setReuseAddr (true);
|
||||
//socket.setReusePort (true);
|
||||
|
||||
@ -136,7 +127,7 @@ int TcpServer::open_tcp_socket (Socket& socket, bool winsock_inheritable, int* e
|
||||
return 0;
|
||||
}
|
||||
|
||||
int TcpServer::start (bool winsock_inheritable, int* err_code) QSE_CPP_NOEXCEPT
|
||||
int TcpServer::start (int* err_code) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
this->server_serving = true;
|
||||
if (err_code != QSE_NULL) *err_code = ERR_NONE;
|
||||
@ -149,7 +140,7 @@ int TcpServer::start (bool winsock_inheritable, int* err_code) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
Socket socket;
|
||||
|
||||
if (this->open_tcp_socket(socket, winsock_inheritable, err_code) <= -1)
|
||||
if (this->open_tcp_socket(socket, err_code) <= -1)
|
||||
{
|
||||
this->server_serving = false;
|
||||
this->setStopRequested (false);
|
||||
@ -204,7 +195,7 @@ int TcpServer::start (bool winsock_inheritable, int* err_code) QSE_CPP_NOEXCEPT
|
||||
socket.close ();
|
||||
|
||||
reopen:
|
||||
if (this->open_tcp_socket (socket, winsock_inheritable, err_code) <= -1)
|
||||
if (this->open_tcp_socket (socket, err_code) <= -1)
|
||||
{
|
||||
if (reopen_count >= 100)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user