diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2008-06-27 03:19:56 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2008-06-27 03:19:56 +0200 |
commit | f5377412a89b2a7f422decd771dc8de49a5498fc (patch) | |
tree | bda661debda3c324189240f3a68cca7a9f4e316b /src/Net | |
parent | ea9fe3ef923000a7bfa4d7afc306669d5442e0fc (diff) | |
download | mad-f5377412a89b2a7f422decd771dc8de49a5498fc.tar mad-f5377412a89b2a7f422decd771dc8de49a5498fc.zip |
Einfaches Polling implementiert
Diffstat (limited to 'src/Net')
-rw-r--r-- | src/Net/Connection.cpp | 37 | ||||
-rw-r--r-- | src/Net/Connection.h | 17 |
2 files changed, 43 insertions, 11 deletions
diff --git a/src/Net/Connection.cpp b/src/Net/Connection.cpp index 4e3fee4..19e7bf1 100644 --- a/src/Net/Connection.cpp +++ b/src/Net/Connection.cpp @@ -25,15 +25,17 @@ namespace Mad { namespace Net { -void Connection::handshake() { - state = HANDSHAKE; +void Connection::doHandshake() { + if(state != HANDSHAKE) + return; int ret = gnutls_handshake(session); if(ret < 0) { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) return; - // Error... disconnect + // TODO: Error + disconnect(); return; } @@ -42,8 +44,14 @@ void Connection::handshake() { } void Connection::packetHeaderReceiveHandler(const void *data, unsigned long length) { - if(length != sizeof(Packet::Data)) - return; // Error... disconnect? + if(state != PACKET_HEADER) + return; + + if(length != sizeof(Packet::Data)) { + // TODO: Error + disconnect(); + return; + } header = *reinterpret_cast<const Packet::Data*>(data); @@ -59,8 +67,14 @@ void Connection::packetHeaderReceiveHandler(const void *data, unsigned long leng } void Connection::packetDataReceiveHandler(const void *data, unsigned long length) { - if(length != header.length) - return; // Error... disconnect? + if(state != PACKET_DATA) + return; + + if(length != header.length) { + // TODO: Error + disconnect(); + return; + } signal(this, Packet(header.type, header.requestId, data, length)); @@ -80,7 +94,8 @@ void Connection::doReceive() { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) return; - // Error... disconnect? + // TODO: Error + disconnect(); return; } @@ -126,7 +141,8 @@ void Connection::doSend() { if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) return; - // Error... disconnect? + // TODO: Error + disconnect(); return; } @@ -171,6 +187,9 @@ void Connection::disconnect() { struct pollfd Connection::getPollfd() const { struct pollfd fd = {sock, (receiveComplete() ? 0 : POLLIN) | (sendQueueEmpty() ? 0 : POLLOUT), 0}; + if(state == HANDSHAKE) + fd.events = ((gnutls_record_get_direction(session) == 0) ? POLLIN : POLLOUT); + return fd; } diff --git a/src/Net/Connection.h b/src/Net/Connection.h index 0880036..e147ad2 100644 --- a/src/Net/Connection.h +++ b/src/Net/Connection.h @@ -54,6 +54,8 @@ class Connection { sigc::signal<void,const Connection*,const Packet&> signal; + void doHandshake(); + void packetHeaderReceiveHandler(const void *data, unsigned long length); void packetDataReceiveHandler(const void *data, unsigned long length); @@ -86,13 +88,24 @@ class Connection { IPAddress *peer; - void handshake(); + void handshake() { + if(isConnected()) + return; + + state = HANDSHAKE; + + doHandshake(); + } + virtual void connectionHeader() = 0; bool rawReceive(unsigned long length, const sigc::slot<void,const void*,unsigned long> ¬ify); bool rawSend(const unsigned char *data, unsigned long length); bool enterReceiveLoop() { + if(!isConnected()) + return false; + state = PACKET_HEADER; return rawReceive(sizeof(Packet::Data), sigc::mem_fun(this, &Connection::packetHeaderReceiveHandler)); @@ -137,7 +150,7 @@ class Connection { void sendReceive() { if(state == HANDSHAKE) { - handshake(); + doHandshake(); return; } |