[性能]高速收发的TCP/MQTT通信

server/2024/9/24 4:04:50/

Nagle算法‌是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前,TCP会暂时存储待发送的数据,等待收到ACK后再将这些数据一起发送出去。

在物联网设备中Nagle算法会有20~40ms的延迟,这在高速场景下是一种弊端,因此要关闭nagle算法。

在下面的代码中,我们使用setsockopt函数来设置TCP_NODELAY选项,并将nagle_enable设置为0,从而关闭Nagle算法。

int nagle_enable = 0; // 关闭Nagle算法
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &nagle_enable, sizeof(nagle_enable)

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>int main() {int sockfd;struct sockaddr_in server_addr;int nagle_enable = 0; // 关闭Nagle算法// 创建socketif ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}// 设置服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);if(inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 设置TCP_NODELAY选项,关闭Nagle算法if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &nagle_enable, sizeof(nagle_enable)) < 0) {perror("setsockopt TCP_NODELAY failed");exit(EXIT_FAILURE);}// 连接服务器if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("connect failed");exit(EXIT_FAILURE);}// 其他操作...// 关闭socketclose(sockfd);return 0;
}

http://www.ppmy.cn/server/121155.html

相关文章

进击J7:对于ResNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务是自行探索解决问题&#xff0c;通过此次思考过程逐渐将知识层面的学习过渡到能力层面的培养上。 一、任务 &#x1f4cc; **你需要解决的疑问&…

【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作

引言 UI自动化测试主要针对软件的用户界面进行测试&#xff0c;以确保用户界面元素的交互和功能符合预期 文章目录 引言一、UI自动化的分类1.1 基于代码的自动化测试1.2 基于录制/回放的自动化测试1.3 基于框架的自动化测试1.4 按测试对象分类1.5 按测试层次分类1.6 按测试执行…

JavaScript语法特点

let用来声明变量数组可通过数组名直接输出数组全部元素数组名.length可以返回长度NaN为数字型字符串可用单引号&#xff0c;双引号&#xff0c;反引号进行包裹字符串用反引号包裹&#xff0c;才可以使用模板字符串字符串.replace(正则&#xff0c;替换字符串)返回的是新字符串,…

Webshell机制绕过的个人理解总结

Webshell是指我们上传到网站的一些恶意后门程序或代码注入&#xff0c;这些Webshell能够使我们获得对网站的远程控制。而Webshell的核心就是那些危险函数&#xff0c;即系统命令执行函数和代码执行函数 常见的系统命令执行函数有system()&#xff0c;exec()&#xff0c;shell_…

js 将二进制文件流,下载为excel文件

吃西瓜 现成的粒子 二进制流&#xff0c;是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同&#xff0c; 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文…

Kotlin 基本介绍(二)

导读大纲 1.1 使用 Kotlin 工具1.1.1 设置和运行 Kotlin 代码JAVA 到 KOTLIN 转换器 1.1.2 编译 Kotlin 代码KOTLIN/JVM 的编译过程 1.1 使用 Kotlin 工具 可以在线运行小片段或安装集成开发环境 1.1.1 设置和运行 Kotlin 代码 使用 IntelliJ IDEA 或 Android Studio 可以获得…

聚观早报 | 小米三折叠手机专利曝光;李斌谈合肥投资蔚来

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月20日消息 小米三折叠手机专利曝光 李斌谈合肥投资蔚来 索尼PS5 Pro包装亮相 新一代Spectacles AR眼镜发布 通…

Lanterns (dp 紫 线段树 二分 维护dp)

Lanterns - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 让所有点被覆盖&#xff0c;那么状态可以设计成覆盖一段前缀&#xff0c;并且中间不允许出现断点 由于CF崩了&#xff0c;所以暂时没提交代码。 记f(i) 为前 i 个灯笼点亮的最长前缀。 由于答案具有保留性&#xff…