summaryrefslogtreecommitdiffstats
path: root/src/Net/Connection.cpp
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-06-25 23:31:48 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-06-25 23:31:48 +0200
commit0e38acdaff7ef753f1d4e140eec9dbaec6f7a047 (patch)
tree09aaa0dd0548249513b5c7b0a4743b8a9f12ee3a /src/Net/Connection.cpp
parent06f98c0289be27cca68f4400fb792e1d27a846b2 (diff)
downloadmad-0e38acdaff7ef753f1d4e140eec9dbaec6f7a047.tar
mad-0e38acdaff7ef753f1d4e140eec9dbaec6f7a047.zip
Nicht-blockierende E/A benutzen
Diffstat (limited to 'src/Net/Connection.cpp')
-rw-r--r--src/Net/Connection.cpp44
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;
+}
+
}
}