diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-06-25 23:31:48 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-06-25 23:31:48 +0200 |
commit | 0e38acdaff7ef753f1d4e140eec9dbaec6f7a047 (patch) | |
tree | 09aaa0dd0548249513b5c7b0a4743b8a9f12ee3a /src/Net/Connection.cpp | |
parent | 06f98c0289be27cca68f4400fb792e1d27a846b2 (diff) | |
download | mad-0e38acdaff7ef753f1d4e140eec9dbaec6f7a047.tar mad-0e38acdaff7ef753f1d4e140eec9dbaec6f7a047.zip |
Nicht-blockierende E/A benutzen
Diffstat (limited to 'src/Net/Connection.cpp')
-rw-r--r-- | src/Net/Connection.cpp | 44 |
1 files changed, 39 insertions, 5 deletions
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 <cstring> +#include <sys/socket.h> 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; +} + } } |