From 0e38acdaff7ef753f1d4e140eec9dbaec6f7a047 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 25 Jun 2008 23:31:48 +0200 Subject: Nicht-blockierende E/A benutzen --- src/Net/Connection.cpp | 44 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) (limited to 'src/Net/Connection.cpp') diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index eb7a55f..e7be313 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -18,11 +18,29 @@ */ #include "Connection.h" +#include "IPAddress.h" #include +#include namespace Mad { namespace Net { +void Connection::handshake() { + state = HANDSHAKE; + + int ret = gnutls_handshake(session); + if(ret < 0) { + if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) + return; + + // Error... disconnect + return; + } + + state = CONNECTION_HEADER; + connectionHeader(); +} + void Connection::packetHeaderReceiveHandler(const void *data, unsigned long length) { if(length != sizeof(Packet::Data)) return; // Error... disconnect? @@ -35,6 +53,7 @@ void Connection::packetHeaderReceiveHandler(const void *data, unsigned long leng enterReceiveLoop(); } else { + state = PACKET_DATA; rawReceive(header.length, sigc::mem_fun(this, &Connection::packetDataReceiveHandler)); } } @@ -52,13 +71,10 @@ void Connection::doReceive() { if(!isConnected()) return; - if(!dataPending()) - return; - if(receiveComplete()) return; - ssize_t ret = gnutls_record_recv(getSession(), transR.data+transR.transmitted, transR.length-transR.transmitted); + ssize_t ret = gnutls_record_recv(session, transR.data+transR.transmitted, transR.length-transR.transmitted); if(ret < 0) { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) @@ -103,7 +119,7 @@ void Connection::doSend() { return; while(!sendQueueEmpty()) { - ssize_t ret = gnutls_record_send(getSession(), transS.front().data+transS.front().transmitted, + ssize_t ret = gnutls_record_send(session, transS.front().data+transS.front().transmitted, transS.front().length-transS.front().transmitted); if(ret < 0) { @@ -134,5 +150,23 @@ bool Connection::rawSend(const unsigned char *data, unsigned long length) { return true; } +void Connection::disconnect() { + if(!isConnected()) + return; + + gnutls_bye(session, GNUTLS_SHUT_RDWR); + + shutdown(sock, SHUT_RDWR); + close(sock); + + gnutls_deinit(session); + + if(peer) + delete peer; + peer = 0; + + state = DISCONNECTED; +} + } } -- cgit v1.2.3