Сокет, который вы создаете внутри incomingConnection(int)
, имеет сигнал disconnected()
. Используйте QSignalMapper
, чтобы определить, какой сокет был отключен, и обновить представление таблицы. Быстрый и грязный код, вероятно, полезный и, конечно, полный синтаксических ошибок:
TcpServer::TcpServer(QWidget *parent) :
QDialog(parent),
ui(new Ui::TcpServer)
{
ui->setupUi(this);
m_coisSerSo = new CoisServerSocket(this);
count = 0;
// The mapper forwards the signal from the client socket,
// adding the socket itself as an argument.
this->mapper = new QSignalMapper(this);
connect(this->mapper, SIGNAL(mapped(QObject*)),
this, SLOT(clientDisconnected(QObject*)));
connect(m_coisSerSo,SIGNAL(newConnection()),this, SLOT(updateConnectionTable()));
}
void CoisServerSocket::incomingConnection(int socketId)
{
socketClient = new CoisClientSocket(this);
socketClient->setSocketDescriptor(socketId);
// Map the socket so that we can receive its disconnection
// notification. When the socket emits the "disconnected()"
// signal, the mapper will emit "mapped(QObject*)" and will
// pass the socket as the argument.
this->mapper->setMapping(socketClient, socketClient);
connect(socketClient, SIGNAL(disconnected()), this->mapper, SLOT(map()));
peerAdd = socketClient->peerAddress().toString();
}
void CoisServerSocket::clientDisconnected(QObject* object)
{
if (CoisClientSocket* client = qobject_cast<CoisClientSocket*>(object))
{
// Unmap the socket.
this->mapper->removeMappings(client);
// Handle disconnection here.
...
// A consequence of mixing a TCP server and a dialog in the
// same class is that passing "this" as an argument to the
// socket constructor doesn't help much with memory management.
// They will stay around as long as the dialog lives. Delete
// them once they aren't needed anymore.
client->deleteLater();
}
}