栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

嵌入式linux学习笔记---TCP立即发出 以及 TCP的keep alive

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

嵌入式linux学习笔记---TCP立即发出 以及 TCP的keep alive

事情的起因是公司的产品的某一个功能存在的bug,所以就有了本次的探索。

需求: 产品在某一个端口上 定时的向外发送1440 字节的数据包,该数据包包含了产品当前的各种状态。
需求2 : 产品本身绑定一个本地的端口 接收来自外部的字符串指令,并且需要对外部传入的字符串指令进行处理。

1. TCP 立即发出

这部分使用的是 TCP_NODELAY 这个标志去实现的。
在创建完端口之后 使用以下的api 为端口设置不缓存的属性,可以实现数据的立即发出!

    int flag = 1;
    setsockopt(this->socketFd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));

效果对比:
使用这个标志之后的数据包 非常稳定 大小是 1440 + 包头 共计 1494 字节,每个数据包都是这么大!

如果不使用这个选项 那么会出现数据包的拼接

这里可以看到 我们的数据被拼接到了一起


虽然两个包 分别是 1420 + 1460 = 1440 + 1440 也就是说数据的总量是没少的,但是 这种类型的拼包显然不是我们期望的!这会造成潜在的数据错位 以及延时!

关于 TCP的立即发出 以下的博客给出了以下说法:

TCP协议栈默认开启nagle 算法来实现网络带宽的优化,可以通过以下方式关闭
//设置tcp
static void socket_set_nodelay(int fd)
{

int flag = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));
}
————————————————
版权声明:本文为CSDN博主「zhaoforyou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhaoforyou/article/details/53590096
2. TCP 的 keepAlive

这个选项主要是用于确保TCP 客户端的存在的, 我们的产品的控制对实时性要求很高,所以也就是需要及时的感知到客户端的掉线事件,在之前的开发中一直存在一种情况,就是如果客户端不是很 “优雅” 的断开了连接(比如直接断开网线 或者直接干掉了进程) 那么我们的服务端是无法感知到客户端的掉线的,而产品为了安全性的考虑,同一时刻只允许一个客户端进行连接,这样也就导致的我们的客户端如果掉线之后也没法重新连接到产品!!! 这是非常严重的一个问题!

所以我们引入了严格的掉线检测机制:
如果1s 之内没有交互数据就回去下发心跳的请求,两次心跳请求间隔为1s 如果连续三次没有心跳 那么久判定客户端掉线!

相关的代码段如下 :

#include    // 这是需要包含的头文件
// ....... 创建socket等操作
    int keepAlive = 1;     // 开启keepalive属性
    int keepIdle = 1;      // 如该连接在1秒内没有任何数据往来,则进行探测 
    int keepInterval = 1;  // 探测时发包的时间间隔为1 秒
    int keepCount = 3;     // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

    setsockopt(this->socketFd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
    setsockopt(this->socketFd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
    setsockopt(this->socketFd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
    setsockopt(this->socketFd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)); 
    // ....  绑定  监听 接受等操作
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/345550.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号