Qt之QTcpSocket 开启Tcp自带的套接字保活机制

44 篇文章 207 订阅 ¥29.90 ¥99.00
3 篇文章 1 订阅
本文介绍了如何利用QTcpSocket的SO_KEEPALIVE选项开启TCP的保活机制,以此来探测并维持网络连接的稳定性。当TCP检测到对端不可用时,select会返回相应状态,便于应用程序处理。
摘要由CSDN通过智能技术生成

简述

        对于正在连接的Tcp网络通信程序中,因为由于某些情况下会出现连接中断,需要心跳检测机制来探测对方是否在线或者维持网络连接需要。而通常的实现方式是自己写代码使用心跳包的形式,这样子就显得代码复杂化,难以控制和管理。在Tcp中其实也有类似的机制,就是TCP保活机制。

SO_KEEPALIVE

        使用::setsockopt设置Tcp属性后,在程序中表现为:当TCP检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上 errno 为 ETIMEDOUT.

void MTcpClient::setSocketKeepAlive()
{
    int iSocket = (int)this->socketDescriptor();
    if (iSocket < 0) return;

    int iKeepAlive = 1;     //开启/关闭keepalive属性
    int iKeepIdle = 5;      //如该连接在5秒内没有任何数据往来, 则进行探测
    int iKeepInterval = 1;  //探测时发包的时间间隔为1秒
    int iKeepCount = 3;     //探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发

    socklen_t iLen = sizeof(socklen_t);
    ::setsockopt(iSocket, SOL_SOCKET, SO_KEEPALIVE, (void *)&iKeepAlive, iLen);
    ::setsockopt(iSocket, SOL_TCP, TCP_KEEPIDLE, (void*)&iKeepIdle, iLen);
    ::setsockopt(iSocket, SOL_TCP, TCP_KEEPINTVL, (void *)&iKeepInterval, iLen);
    ::setsockopt(iSocket, SOL_TCP, TCP_KEEPCNT, (void *)&iKeepCount, iLen);
}

        MTcpClient继承QTcpClient,所以可以通过this->socketDescriptor()获取套接字对象。       

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt 中创建本地 IP 套接字可以使用 QTcpSocket 类。下面是一个简单的示例代码,演示如何创建一个本地 IP 套接字: ```cpp #include <QtNetwork/QTcpSocket> #include <QtNetwork/QHostAddress> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpSocket socket; socket.connectToHost(QHostAddress::LocalHost, 8080); return a.exec(); } ``` 在上面的示例中,我们首先包含了 `QTcpSocket` 和 `QHostAddress` 头文件。然后,我们创建了一个 `QTcpSocket` 对象并调用了 `connectToHost()` 函数来连接到本地 IP 地址和端口号为 8080 的主机。在实际应用中,你需要根据你的需求来更改本地 IP 地址和端口号。 需要注意的是,如果你希望创建一个本地服务器套接字,你需要使用 `QTcpServer` 类。在服务器端,你需要监听来自本地 IP 地址和端口号的连接请求。以下是一个简单的示例代码,演示如何创建一个本地服务器套接字: ```cpp #include <QtNetwork/QTcpServer> #include <QtNetwork/QHostAddress> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpServer server; server.listen(QHostAddress::LocalHost, 8080); return a.exec(); } ``` 在上面的示例中,我们首先包含了 `QTcpServer` 和 `QHostAddress` 头文件。然后,我们创建了一个 `QTcpServer` 对象并调用了 `listen()` 函数来监听来自本地 IP 地址和端口号为 8080 的连接请求。在实际应用中,你需要根据你的需求来更改本地 IP 地址和端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ilson_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值