Time for action – detecting a disconnect
When a client terminates the connection, we have to delete the socket from the local m_clients
list. Therefore, we have to connected the socket's disconnected()
signal to:
void TcpServer::removeConnection() { if (QTcpSocket *con = qobject_cast<QTcpSocket*>(sender())) { ui->log->insertPlainText( QString("* Connection removed: %1, port %2\n") .arg(con->peerAddress().toString()) .arg(QString::number(con->peerPort()))); m_clients.removeOne(con); con->deleteLater(); ui->disconnectClients->setEnabled(!m_clients.isEmpty()); } }
What just happened?
After getting the socket that emitted the call through sender()
, we post the information that a socket is being removed. Then, we remove the socket from m_clients
and call deleteLater()
on it. Do not use delete. Lastly, if no client is left, the disconnect button is disabled.
This is the first part. Now let's have a look...