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...