summaryrefslogtreecommitdiffstats
path: root/src/server/net/client.cpp
diff options
context:
space:
mode:
authorsr2013-02-05 19:00:11 +0100
committersr2013-02-05 19:00:11 +0100
commit62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7 (patch)
tree5a19e024633de3ccdaf2f182b75374d74bac5dbf /src/server/net/client.cpp
parent[SHARED] Add missing error message if network message parsing fails (diff)
downloadpvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.tar.gz
pvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.tar.xz
pvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.zip
[SERVER/CLIENT] Wait for connection to close properly before deleting socket object
Diffstat (limited to 'src/server/net/client.cpp')
-rw-r--r--src/server/net/client.cpp31
1 files changed, 23 insertions, 8 deletions
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();
}
}