我正在尝试在Qt中创建服务器/客户端。
TCP Server从客户端获取最多4个连接。
创建......
// server.h
class Server : public QTcpServer{
...
QList<QTcpSocket *> list;
}
// server.cpp
Server::start(){
QTcpSocket *curr = nextPendingConnection();
connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater()));
list.append(curr);
}
此代码会通过将disconnected()信号连接到deleteLater()来删除内存 但我不知道如何从列表中删除指针。我如何知道哪个连接已关闭?
我想从列表中删除断开连接的QTcpSocket指针元素以管理连接。
请帮忙......
(我想如果有一个SIGNAL(断开连接(QTcpSocket *)),这一定要容易得多)
答案 0 :(得分:0)
您可以使用QObject::sender()
:
void onDisconnect()
{
QTcpSocket sock = qobject_cast<QTcpSocket*>(sender());
if (sock != 0)
{
list.removeAll(sock);
sock->deleteLater();
}
}
只需将此插槽连接到disconnected()
信号,即可释放内存并从列表中删除套接字。
使用sender()
有一些缺点。我建议在使用前阅读docs。
答案 1 :(得分:0)
像其他人一样指出qobject :: sender应该工作
Server::start(){
QTcpSocket *curr = nextPendingConnection();
connect(curr, SIGNAL(disconnected()), curr, SLOT(deleteLater()));
connect(curr, SIGNAL(disconnected()), this, SLOT(onDisconection()));
list.append(curr);
}
void onDisconection()
{
list.removeOne(qobject_cast<QTcpSocket*>(sender()));
}
但由于所述发件人有一些缺点,我建议使用信号映射器,请参阅http://doc.qt.io/qt-5/qsignalmapper.html