QTcpServer 管理断开连接的客户端的两种方法

在接收连接时,关联disconneted信号,这个信号没有参数,我们可以使用sender()获取信号发送者,也就是客户端socket,这样我们就知道哪个客户端和我们断开连接了。

但是这个方法有个缺点,就是如果客户端异常退出,没有调用disconnect函数,则服务端接收不到这个disconnected的信号。

 

// 接收连接
void TcpServer::onAccept()
{
    QTcpSocket* pQTcpSocket = qtcpServer->nextPendingConnection();
    if (pQTcpSocket==nullptr)
        return;
    connect(pQTcpSocket,&QTcpSocket::disconnected,this,&TcpServer::clientDisconnected);
    client = pQTcpSocket;
    qDebug()<<"receive connect!"<<pQTcpSocket;
}
// 客户端断开连接
void TcpServer::clientDisconnected()
{
    QTcpSocket* pQTcpSocket = static_cast<QTcpSocket*>(sender());
    qDebug()<<"receive disconnect!"<<pQTcpSocket;
    pQTcpSocket->deleteLater();
}

还有一种方法,就是启动一个定时器,定时遍历客户端列表,每个客户端尝试发送一个数据,如果发送失败会返回-1,这是就可以将这个返回-1的socket删除掉。

 

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QTcpServer客户连接断开时,可以通过以下代码进行处理: ```cpp // 在QTcpServer的派生类中,重写incomingConnection函数 void MyTcpServer::incomingConnection(qintptr socketDescriptor) { // 创建QTcpSocket对象 QTcpSocket *clientSocket = new QTcpSocket(this); // 通过socketDescriptor设置socket描述符 clientSocket->setSocketDescriptor(socketDescriptor); // 连接断开时的信号槽连接 connect(clientSocket, &QTcpSocket::disconnected, this, &MyTcpServer::onClientDisconnected); // 其他处理逻辑... } // 客户连接断开时的槽函数 void MyTcpServer::onClientDisconnected() { QTcpSocket *clientSocket = qobject_cast<QTcpSocket*>(sender()); if (clientSocket) { // 处理连接断开的逻辑... // 例如,关闭socket并释放资源 clientSocket->close(); clientSocket->deleteLater(); } } ``` 在上述代码中,我们首先在派生类中重写了`incomingConnection`函数,该函数在有新的客户连接时被调用。在该函数中,我们创建了一个`QTcpSocket`对象,并将其与客户连接建立起来。 然后,我们通过连接`QTcpSocket`对象的`disconnected`信号与`onClientDisconnected`槽函数进行关联。当客户连接断开时,会触发`disconnected`信号,从而调用`onClientDisconnected`槽函数。 在`onClientDisconnected`槽函数中,我们首先通过`sender()`函数获取到发送信号的对象,即断开连接的`QTcpSocket`对象。然后,我们可以在该槽函数中进行连接断开后的处理逻辑,例如关闭socket并释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值