| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> udp接收队列以及多次初始化的测试 -> 正文阅读 |
|
[网络协议]udp接收队列以及多次初始化的测试 |
这一段时间基于udp的数据重放的过程中图像总是卡死,发现recv Q满了,但是不知道具体原因是啥,这里就先进行了udp的接收测试。 一. 正常测试?
二. 当recv端cnt==800时,执行socket重新初始化?if(cnt == 800) ?????? { ?????? ???serfd=socket(AF_INET,SOCK_DGRAM,0); ?????????? printf("serfd = %d\n",serfd); ????????? // ret=bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr)); ?????? }
? 无论是否执行bind操作,接收端都会卡住,接收队列都会满。同时/proc/pid/fd下面会新增一个socket文件,对应的fd为4。如果执行bind,则会返回绑定失败,端口被占用。 原因:经过上述的if语句后,serfd已经变成了4,对应的是一个新的socket文件,也就是说recv端会有一个新的接收队列,只是没有数据发送到这个新的队列。send端发送的数据依旧发送到serfd=3对应的队列中,但该队列没有人去读取了,造成recv Q 满了。表象就是卡住了,实际上是因为serfd=4对应的队列中没有数据。 ? ? 2. socket初始化,同时将recvfrom函数中用到的serfd换成3这个常量 除了上述修改外,如果把recvfrom的serfd换成常量3,则虽然新生成4对应的fd,但是数据依然从3对应的队列中获取,也不会卡住,只是4对应队列中没有数据。 三. 当recv端cnt==800时,执行socket重新初始化?if(cnt == 800) ?{ if(serfd>0) ret = close(serfd); ?????? printf("close serfd=%d\n",ret); ????????? serfd=socket(AF_INET,SOCK_DGRAM,0); ????????? sleep(1); ?????????? printf("serfd = %d\n",serfd); ????????? ret=bind(serfd,(struct sockaddr *)&seraddr,sizeof(seraddr)); ?????? } 原因: 在cnt 为800时,原来的fd会关闭,/proc/pid/fd/下面的文件3也会被删掉;之后,重新执行 serfd=socket(AF_INET,SOCK_DGRAM,0);后,会申请可用的fd,而这个时候因为3号fd已经释放了,所以重新申请到的fd还是3。只不过此时对应的inode号发生了变更,从2130436变成了2132215。而8888端口对应的recv Q中的100多k的数据直接清0,然后开始新的积累数据。 测试程序
编译: g++ recv.cpp -o recv g++ send.cpp -o send 五. 运行顺序1. 准备工作 启动6个命令窗口,进入到上述文件目录下; 2. 先在terminal#1运行recv程序,可以将之重定向到其它文件; ./recv > r3.txt 3. 在terminal#2运行send程序 ./send 4. 在terminal#3查看rtxt的最后10行,每秒更新一次,主要用于确认cnt=800大概在什么时候; watch -n 1 tail -n10 r3.txt ?5. 在terminal#4查看recv对应的pid,然后进入到/proc/pid/fd查看socket文件,并每秒更新一次,查看socket文件是否变化; 6.?查看udp丢包情况以及socket对应的文件的inode是否变化; watch -n 1 "cat /proc/net/udp |grep 22B8" 其中22B8是端口8888的十六进制表示。 目前看丢包6121个;2705799就是目前8888端口对应socket文件的inode号。和/proc/pid/fd下面的文件一致; ?7.?查看udp的接收队列情况 watch -n 1 netstat -anu 可以看到目前recv Q保持高位运行。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:39:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |