socket选项自带的TCP异常断开检测

  TCP异常断开是指在突然断电,直接拔网线等等情况下,如果通信双方没有进行数据发送通信等处理的时候,无法获知连接已经断开的情况.

  在通常的情况下,为了使得socket通信不受操作系统的限制,需要自己在应用层实现心跳包机制,来检查异常断开的情况,一般的方式就是服务器在一段时间没有收到客户端数据包时,定时发包,然后客户端回应,如果已经出现异常断开则服务器接收会返回错误,而客户端在指定时间内没有收到数据包,则主动向服务器发包,得到错误就说明断开.诸如此类的方式就是自己实现的心跳包机制.

  但操作系统本身也自带了一些心跳包机制,这些机制是由socket的TCP栈底层实现的,不会影响应用层通信,也不需要应用层自己处理,发现异常断开可以自行检查出来并返回错误(它的本质也是在空闲时发送心跳包).以下介绍一下Windows以及linux下的方法.

  首先介绍Windows下的方法,该方式要求通信双方必须都是Windows NT以上操作系统(如果是其它版本操作系统,如linux等等,不敢保证100%无效).MSDN中有描述WSAIoctl中的SIO_KEEPALIVE_VALS选项,该选项以及struct tcp_keepalive的定义在MSTCPiP.h有,不进行说明了,直接看代码:

    #include <MSTCPiP.h>



    DWORD retBytes;
    tcp_keepalive inKeepSetting;
    tcp_keepalive retKeepSetting;

    inKeepSetting.onoff = 1;                //探测次数
    inKeepSetting.keepalivetime = 5500;        // 首次探测开始前的tcp无数据收发空闲时间
    inKeepSetting.keepaliveinterval = 3000;    // 每次探测的间隔时间

    if (WSAIoctl(aptSock, SIO_KEEPALIVE_VALS,
        &inKeepSetting,
        sizeof(inKeepSetting),
        &retKeepSetting,
        sizeof(retKeepSetting),
        &retBytes,
        NULL,
        NULL) != 0)
    {
        printf("WSAIoctl Error: %d/n", WSAGetLastError());
    }

  Linux下的方式是通过setsockopt来设置选项,见代码:

#include   <netinet/tcp.h>

...

#define SOCKET_ERROR (-1)

// 以秒为单位
int keepAlive = 1;       //设定KeepAlive
int keepIdle = 5;        //首次探测开始前的tcp无数据收发空闲时间
int keepInterval = 3;  //每次探测的间隔时间
int keepCount = 2;     //探测次数
               
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive)) == SOCKET_ERROR) {
    printf("Call setsockopt error, errno is %d/n", errno);
}

if (setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle)) == SOCKET_ERROR) {
    printf("Call setsockopt error, errno is %d/n", errno);
}

if (setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval)) == SOCKET_ERROR) {
    printf("Call setsockopt error, errno is %d/n", errno);
}
               
if (setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount)) == SOCKET_ERROR) {
    printf("Call setsockopt error, errno is %d/n", errno);
}

### 4G DTU TCP/UDP 数据透传配置与使用方法 #### 配置概述 4G DTU 是一种用于实现数据透明传输的设备,能够将串口数据转换为 IP 数据或将 IP 数据转换为串口数据。其核心功能之一是支持 TCP 和 UDP 的数据透传[^1]。以下是关于如何配置和使用 4G DTU 实现 TCP 或 UDP 数据透传的具体说明。 --- #### 硬件准备 在开始配置之前,请确保以下条件已满足: 1. 已购买并接收到一台兼容的 4G DTU 设备(如众山科技 LTE660、TD210 或其他品牌型号)。 2. 准备好需要连接的传感器或其他串口设备。 3. 确认目标服务器地址以及端口号(如果是 TCP,则需指定服务端监听的 IP 地址和端口;如果是 UDP,则仅需知道目的地址和端口)。 --- #### 软件工具 通常情况下,厂商会提供配套的配置软件来简化设置过程。例如: - **众山科技** 提供了专用的配置工具,可以通过 USB 接口或 Web 页面完成基本参数设定。 - 如果未配备专门软件,也可以通过 AT 指令手动调整配置。 --- #### 配置步骤详解 ##### 1. 进入配置界面 启动随附的配置程序,或者登录到 DTU 自带的 Web 控制台。输入默认用户名密码(一般为 admin/admin),进入主菜单。 ##### 2. 设置工作模式 选择适合的应用场景: - 对于 **TCP 客户端模式**:DTU 主动向远端服务器发起连接请求。 - 对于 **TCP 服务器模式**:DTU 绑定特定端口等待客户端接入。 - 对于 **UDP 模式**:无需建立长期连接,直接发送数据包至指定目的地。 ##### 3. 输入目标信息 根据实际需求填写必要的字段: - **Server Address**: 目标主机公网 IPv4 地址或域名。 - **Port Number**: 所使用的端口号,默认范围为 1~65535。 - 若采用 UDP 方式还需额外指明源端口(Source Port),以便回显响应消息时识别身份。 ##### 4. 启用心跳保持机制 (可选) 为了防止长时间无活动断开链接,建议开启定期探测功能。具体选项可能包括但不限于: - 发送固定字符串作为维持链路存活信号; - 时间间隔单位秒(s)。 ##### 5. 测试连通性 保存更改之后尝试模拟真实环境下的交互流程验证效果。如果一切正常应该可以看到状态栏显示“Connected”。 ##### 6. 应用实例化部署 最后一步便是正式投入使用前再次确认所有细节均符合预期,并妥善安置硬件设施以免受到外界干扰影响性能表现。 --- #### 示例代码片段 下面给出一段 Python 脚本来演示如何借助第三方库 `socket` 来创建简单的 TCP Server: ```python import socket def start_tcp_server(host='0.0.0.0', port=9999): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() conn, addr = s.accept() # Wait for a connection with conn: print(f'Connected by {addr}') while True: data = conn.recv(1024).decode('utf-8') if not data: break print(f'Received message: {data}') if __name__ == '__main__': start_tcp_server() ``` 此脚本适用于测试阶段充当虚拟接收方角色配合调试整个系统架构运作状况良好与否。 --- #### 注意事项 尽管大部分现代款型都具备良好的稳定性保障措施比如内置看门狗电路设计以防死机现象发生但仍推荐定时重启维护延长使用寿命减少潜在风险隐患[^2]。 另外值得注意的是当涉及到敏感信息安全方面最好启用 SSL 加密通道或者其他更高级别的防护手段进一步提升整体安全性水平避免遭受恶意攻击威胁损害利益造成损失不可挽回的局面出现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值