From 62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7 Mon Sep 17 00:00:00 2001 From: sr Date: Tue, 5 Feb 2013 19:00:11 +0100 Subject: [SERVER/CLIENT] Wait for connection to close properly before deleting socket object --- src/server/net/client.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'src/server/net/client.cpp') diff --git a/src/server/net/client.cpp b/src/server/net/client.cpp index fdabb99..12b28a0 100644 --- a/src/server/net/client.cpp +++ b/src/server/net/client.cpp @@ -19,7 +19,7 @@ ClientId Client::_clientIdCounter = 0; Client::Client(QSslSocket* socket) : - _socket(socket), _authed(0), _desiredProjectionSource(0), _isProjectionSource(false), + _socket(socket), _authed(0), _timerDelete(0), _desiredProjectionSource(0), _isProjectionSource(false), _currentProjectionSource(0), _vncPort(0), _activeVncClient(false), _isTutor(false) { assert(socket != NULL); @@ -48,7 +48,7 @@ Client::~Client() { if (_socket != NULL) { - qDebug("**** DELETE IN DESTRUCTOR"); + qCritical("**** SOCKET DELETE IN DESTRUCTOR"); _socket->deleteLater(); } qDebug("*** Client %s destroyed.", qPrintable(_ip)); @@ -63,6 +63,22 @@ void Client::timerEvent(QTimerEvent* event) _timerIdAuthTimeout = 0; this->disconnect(); } + else if (event->timerId() == _timerDelete) + { + if (_socket == NULL || _socket->state() == QAbstractSocket::UnconnectedState) + { + if (_socket != NULL) + _socket->deleteLater(); + _socket = NULL; + killTimer(_timerDelete); + this->deleteLater(); + return; + } + _socket->abort(); + qDebug("A socket is still pending..."); + } + else + killTimer(event->timerId()); } void Client::sendMessage(NetworkMessage& message) @@ -113,9 +129,9 @@ void Client::onDataArrival() if (_fromClient.readComplete()) // message is complete { this->handleMsg(); + _fromClient.reset(); if (_socket == NULL) return; - _fromClient.reset(); } } } @@ -243,7 +259,7 @@ void Client::handleMsg() { // Challenge reply is invalid, drop client _toClient.buildErrorMessage("Challenge reply invalid."); _toClient.writeMessage(_socket); - this->deleteLater(); + this->disconnect(); return; } // Now answer to challenge by client @@ -294,13 +310,12 @@ void Client::setTutor(bool enable) void Client::disconnect() { - if (_socket != NULL) + if (_timerDelete == 0) { + emit disconnected(); + _timerDelete = startTimer(500); qDebug("*** Client %s disconnected.", qPrintable(_ip)); _socket->blockSignals(true); _socket->abort(); - _socket->deleteLater(); - _socket = NULL; - this->deleteLater(); } } -- cgit v1.2.3-55-g7522