如何知道连接到QTcpServer的客户端是否已关闭连接?

时间:2014-08-16 12:01:31

标签: c++ qt networking tcp network-programming

我想将数据从特定位置(共享内存)传递到客户端应用程序。一个线程不断地轮询SHM以获取新数据,并且一旦获得某些内容,它就会将其传递给客户端。

此类客户端应用程序的多个实例可以连接到我的(QTcpServer)服务器。

每次我的服务器收到一个新连接并将所有这些套接字存储在一个向量中时,我打算简单地创建一个新的QTcpSocket。之后,在每次成功的民意调查中,我会将数据写入存储在向量中的所有QTcpSocket

但是如果客户端断开连接(关闭他的窗口),我需要知道它!我会继续写信给不再存在的QTcpSocket并最终崩溃。

这里有什么解决方案?

QTcpServer类中只有2个信号:

Signals
void    acceptError(QAbstractSocket::SocketError socketError)
void    newConnection()
2 signals inherited from QObject

2 个答案:

答案 0 :(得分:3)

您有一个包含向量或套接字列表的类。只要此类派生自QObject,您就可以使用QTcpSocket的信号和插槽在断开连接时通知类。

所以,我会这样做: -

class Server : public QObject
{
    Q_OBJECT

    public:
        Server();

    public slots:
        // Slot to handle disconnected client
        void ClientDisconnected(); 

    private slots:
        // New client connection
        void NewConnection();

    private:
        QTcpSocket* m_pServerSocket;
        QList<QTcpSocket*> m_pClientSocketList;
};

Server::Server()
{   // Qt 5 connect syntax
    connect(m_pServerSocket, &QTcpServer::newConnection, this, &Server::NewConnection);
}

void Server::NewConnection()
{
    QTcpSocket* pClient = nextPendingConnection();
    m_pClientSocketList.push_back(pClient);

    // Qt 5 connect syntax
    connect(pClient, &QTcpSocket::disconnected, this, &Server::ClientDisconnected);
}

void Server::ClientDisconnected()
{
    // client has disconnected, so remove from list
    QTcpSocket* pClient = static_cast<QTcpSocket*>(QObject::sender());
    m_pClientSocketList.removeOne(pClient);
}

答案 1 :(得分:0)

您必须以这种方式将TCP KeepAplive选项设置为套接字:

mySocket->setSocketOption(QAbstractSocket:: KeepAliveOption, 1);