From d1306a1710cda4acb9a0138347cdb43943271b9c Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 27 Jun 2008 19:34:09 +0200 Subject: Verbindungen geregelt trennen... hoffentlich... --- src/Net/Connection.h | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'src/Net/Connection.h') diff --git a/src/Net/Connection.h b/src/Net/Connection.h index adb677a..a3670b0 100644 --- a/src/Net/Connection.h +++ b/src/Net/Connection.h @@ -44,7 +44,7 @@ class Connection { }; enum State { - DISCONNECTED, HANDSHAKE, CONNECTION_HEADER, PACKET_HEADER, PACKET_DATA + DISCONNECTED, HANDSHAKE, CONNECTION_HEADER, PACKET_HEADER, PACKET_DATA, DISCONNECT, BYE } state; Transmission transR; @@ -52,7 +52,7 @@ class Connection { Packet::Data header; - sigc::signal signal; + sigc::signal signal; void doHandshake(); @@ -62,6 +62,8 @@ class Connection { void doReceive(); void doSend(); + void doDisconnect(); + bool receiveComplete() const { return (transR.length == transR.transmitted); } @@ -103,7 +105,7 @@ class Connection { bool rawSend(const unsigned char *data, unsigned long length); bool enterReceiveLoop() { - if(!isConnected()) + if(!isConnected() || isDisconnecting()) return false; state = PACKET_HEADER; @@ -119,7 +121,7 @@ class Connection { virtual ~Connection() { if(isConnected()) - disconnect(); + doDisconnect(); if(transR.data) delete [] transR.data; @@ -131,19 +133,30 @@ class Connection { } bool isConnected() const {return (state != DISCONNECTED);} - bool isConnecting() { + bool isConnecting() const { return (state == HANDSHAKE || state == CONNECTION_HEADER); } + bool isDisconnecting() const { + return (state == DISCONNECT || state == BYE); + } + const IPAddress* getPeer() {return peer;} int getSocket() const {return sock;} - void disconnect(); + void disconnect() { + if(isConnected() && !isDisconnecting()) { + state = DISCONNECT; + + if(sendQueueEmpty()) + doDisconnect(); + } + } struct pollfd getPollfd() const; bool send(const Packet &packet) { - if(!isConnected() || isConnecting()) + if(!isConnected() || isConnecting() || isDisconnecting()) return false; return rawSend(reinterpret_cast(packet.getRawData()), packet.getRawDataLength()); @@ -151,7 +164,7 @@ class Connection { void sendReceive(short events = POLLIN|POLLOUT) { if(events & POLLHUP || events & POLLERR) { - disconnect(); + doDisconnect(); return; } @@ -165,11 +178,14 @@ class Connection { if(events & POLLOUT) doSend(); + + if(state == DISCONNECT && sendQueueEmpty()) + doDisconnect(); } bool sendQueueEmpty() const {return transS.empty();} - sigc::signal signalReceive() const {return signal;} + sigc::signal signalReceive() const {return signal;} static void init() { gnutls_global_init(); -- cgit v1.2.3