diff options
Diffstat (limited to 'src/Net/ServerConnection.cpp')
-rw-r--r-- | src/Net/ServerConnection.cpp | 56 |
1 files changed, 9 insertions, 47 deletions
diff --git a/src/Net/ServerConnection.cpp b/src/Net/ServerConnection.cpp index 4ad6215..4f1c78c 100644 --- a/src/Net/ServerConnection.cpp +++ b/src/Net/ServerConnection.cpp @@ -57,65 +57,27 @@ void ServerConnection::connectionHeaderReceiveHandler(const void *data, unsigned enterReceiveLoop(); } -void ServerConnection::listen(const IPAddress &address) throw(ConnectionException) { - const int kx_list[] = {GNUTLS_KX_ANON_DH, 0}; - - if(isConnected()) - disconnect(); - - int listen_sock = socket(PF_INET, SOCK_STREAM, 0); - if(listen_sock < 0) - throw ConnectionException("socket()", std::strerror(errno)); - - peer = new IPAddress(address); - - if(bind(listen_sock, peer->getSockAddr(), peer->getSockAddrLength()) < 0) { - close(listen_sock); - delete peer; - - throw ConnectionException("bind()", std::strerror(errno)); - } - - if(::listen(listen_sock, 1024) < 0) { - close(listen_sock); - delete peer; - - throw ConnectionException("listen()", std::strerror(errno)); - } +ServerConnection::ServerConnection(int sock0, const IPAddress &address, gnutls_dh_params_t dh_params) +: daemon(false) { + sock = sock0; - struct sockaddr_in sa; - socklen_t addrlen = sizeof(sa); + gnutls_anon_allocate_server_credentials(&anoncred); - sock = accept(listen_sock, reinterpret_cast<struct sockaddr*>(&sa), &addrlen); - if(sock < 0) { - close(listen_sock); - delete peer; - - throw ConnectionException("accept()", std::strerror(errno)); - } - close(listen_sock); + gnutls_anon_set_server_dh_params(anoncred, dh_params); - // Set non-blocking flag - int flags = fcntl(sock, F_GETFL, 0); - - if(flags < 0) { - close(sock); - - throw ConnectionException("fcntl()", std::strerror(errno)); - } - - fcntl(sock, F_SETFL, flags | O_NONBLOCK); - - *peer = IPAddress(address); + peer = new IPAddress(address); gnutls_init(&session, GNUTLS_SERVER); gnutls_set_default_priority(session); + + const int kx_list[] = {GNUTLS_KX_ANON_DH, 0}; gnutls_kx_set_priority(session, kx_list); gnutls_credentials_set(session, GNUTLS_CRD_ANON, anoncred); + gnutls_transport_set_lowat(session, 0); gnutls_transport_set_ptr(session, reinterpret_cast<gnutls_transport_ptr_t>(sock)); handshake(); |