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

本文探讨了在TCP服务端如何有效监测客户端断开连接的情况。通过连接disconnected信号来识别正常断开的客户端,并介绍了当客户端异常退出时,服务端如何通过定时器检查并移除已断开的socket,确保服务端状态的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在接收连接时,关联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删除掉。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值