0

我正在尝试在 Qt 中制作服务器/客户端。

TCP 服务器从客户端接受最多 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 *)),这一定容易得多)

4

2 回答 2

0

你可以使用QObject::sender()

void onDisconnect()
{
    QTcpSocket sock = qobject_cast<QTcpSocket*>(sender());

    if (sock != 0)
    {
        list.removeAll(sock);
        sock->deleteLater();
    }
}

只需将此插槽连接到disconnected()信号,内存将被释放并从列表中删除套接字。

但是,使用sender()有一些缺点。我建议在使用之前阅读文档。

于 2010-07-04T08:32:16.563 回答
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

于 2010-07-04T12:19:41.917 回答