摘要

本文记录通过数据报套接字来检测UDP数据包的延迟和丢包的思路和简单的代码实现。

思路

UDP协议及用户数据报协议在传输层提供了无连接、不可靠的传输服务,端到端的延迟以及丢包率是反应当前网络环境好坏的重要评价标准。Ping检测延迟的方式是:发送端发送一个ICMP包给接收端,接收端接收到ICMP包之后向发送端回应一个包,发送端可以计算出往返时间(RTT),本文通过套接字使用类似于Ping的思路来计算RTT来反映延迟的大小,可以多次发包根据多次的结果来计算一个平均的RTT;丢包率可以通过指定发送端发包的数量,然后在接收端统计接收成功的数量,就可以计算出当前丢包率。

说明

  • 数据报套接字(SOCK-DGRAM)在传输层使用的UDP协议,所以在创建socket的时候一定要指定使用SOCK_DGRAM类型的套接字,这样系统在封装数据包的时候才使用的是UDP协议。
  • 因为不同设备的网络数据发送能力和接受能力都有限,发送端每次发送内容的长度也就是数据包的大小,以及发送速率都是影响接收端延迟和丢包率的因素;因此将发送数据大小(bytes)、发送数据包数量、发送间隔(ms)都作为程序的参数,根据不用的应用场景指定对应的参数,得到的结果会有一定的参考价值。

代码实现

加入头文件

代码实在windows环境下写的,所以发送端和接收端调用函数之前都需要加入头文件和预处理指令

#include <iostream>
#include <ctime>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")  //加载 ws2_32.dll

发送端函数

//参数分别为接收端的IP地址、端口以及本次发包的数量和每个包的内容长度
void udp_delay_detect_client(const char* ip,int port,int packetSize,int packetNum)
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);//创建UDP套接字SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);//服务器地址信息sockaddr_in servAddr;memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充servAddr.sin_family = PF_INET;servAddr.sin_addr.s_addr = inet_addr(ip);servAddr.sin_port = htons(port);//不断获取用户输入并发送给服务器,然后接受服务器数据SOCKADDR clntAddr;  //客户端地址信息int nSize = sizeof(SOCKADDR);char bufSend[packetSize+1];memset(bufSend,'a',sizeof(bufSend));bufSend[packetSize]='\0';char bufRecv[packetSize+1];//先发一个包告诉接收端要开始发包了sendto(sock,bufSend,strlen(bufSend),0,(struct sockaddr*)&servAddr, sizeof(servAddr));        int send_count=packetNum;int recv_count=0;double sum_delay=0;double sum_jitter=0;double last_delay;int recv_miss_count=0;//设置超时等待int timeout = 2000; //2sint ret=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));while(send_count--){sendto(sock, bufSend, strlen(bufSend), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));clock_t start=clock();int strLen = recvfrom(sock, bufRecv, packetSize, 0, &clntAddr, &nSize);if(strLen<1){continue;}clock_t end=clock();recv_count++;double delay=(double)(end-start)*1000/CLOCKS_PER_SEC;double jitter;if(send_count==packetNum){jitter=0,last_delay=delay;continue;}jitter=fabs(delay-last_delay);sum_delay+=delay;sum_jitter+=jitter;}double delay=sum_delay/packetNum;double jitter=sum_jitter/packetNum;cout<<"RRT:"<<delay<<"ms jitter:"<<jitter<<"ms packet_loss_rate:"<<1-(double)recv_count/packetNum<<endl;closesocket(sock);
}
接收端函数
void udp_delay_detect_server(int port)       //指定端口
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);//创建套接字SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);//绑定套接字sockaddr_in servAddr;memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充servAddr.sin_family = PF_INET;  //使用IPv4地址servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //自动获取IP地址servAddr.sin_port = htons(port);  //端口bind(sock, (SOCKADDR*)&servAddr, sizeof(SOCKADDR));//接收客户端请求SOCKADDR clntAddr;  //客户端地址信息int nSize = sizeof(SOCKADDR);char buffer[BUF_SIZE];  //缓冲区recvfrom(sock,buffer,BUF_SIZE,0,&clntAddr,&nSize);            //接受发送端的开始发送的信号int recv_count=0;//设置超时等待int timeout = 2000; //2sint ret=setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));int recv_miss_count=0;while(1){int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &clntAddr, &nSize);if(strLen>1)              //验证接受字符串的长度{sendto(sock, buffer, strLen, 0, &clntAddr, nSize);recv_count++;}else{recv_miss_count++;cout<<"no packet recieve!"<<endl;if(recv_miss_count==3)                //超过三次超时等待则认为接收完毕break;}}cout<<"packet_recv_count:"<<recv_count<<endl;closesocket(sock);
}

UDP数据包的延迟及丢包检测(C++)相关推荐

  1. 【测试】linux tc命令|Linux模拟网络延迟、丢包等|traffic control(流量控制)

    目录 一.工具介绍 1.netem 2.tc 二.命令使用说明 1.模拟延迟传输 2.模拟网络丢包: 3.模拟包重复: 4.模拟数据包损坏: 5.模拟数据包乱序: 6.删除模拟配置: 更多高级用法 一 ...

  2. Linux Command tc 模拟网络延迟和丢包

    Linux Command tc 模拟网络延迟和丢包 文章目录 Linux Command tc 模拟网络延迟和丢包 1. 介绍 2. 规则 2.1 流量控制方式 2.2 流量控制处理对象 3. 操作 ...

  3. 利用traffic control模拟网络延迟和丢包

    1. 模拟延迟和丢包语句介绍 # 设置延迟语句: 从 eno1.enp7s0f0 网口出去的包将延迟20ms tc qdisc add dev eno1 root netem delay 20ms t ...

  4. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    [转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnbl ...

  5. Linux下使用 tc 模拟网络延迟和丢包

    1.模拟延迟传输简介 netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带 ...

  6. 弱网测试:使用netem模拟网络延迟、丢包、损坏、重复、和乱序等网络问题

    本文目录 1.延时---Delay 1.1.enp2s0 网卡上增加100ms延时 1.2.enp2s0 网卡上增加100ms ± 20ms的延时(80ms到120ms) 1.3.enp2s0 网卡上 ...

  7. 直播测试-网络延迟和丢包工具设置

    网络延迟和丢包工具网络设置方法 首先我们使用网络模拟的工具是:Network-Emulator-Toolkit-x64,打开在主界面上的按钮:new filter和new link可以新建网络的配置和 ...

  8. zabbix实现简单的IPV6地址监控(可仿照实现延迟和丢包)

    zabbix自定义监控ipv6 前提条件 1.需要zabbix-server端和zabbix-agent端 2.agent端需要开启Include模块和UnsafeUserParameters参数 3 ...

  9. 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...

最新文章

  1. python基础之socket编程
  2. IMAX融资5000万美元,三年内要打造25个VR项目
  3. 深入理解ByteBuffer
  4. LeetCode_数组_中等题
  5. activemq和mysql_activeMQ 填坑记
  6. php rsa加密乱码_php RSA加解密
  7. 【安全】导入本地linux用户到LDAP中
  8. 这个 DNS 新漏洞可导致大规模的 DDoS 攻击活动
  9. Quartz+Topshelf 作业
  10. python数组拼接concat_【JavaScript】重写数组的concat()方法
  11. mysql 按照汉字的拼音排序、按照首字母分类
  12. hihocoder-13892016北京网赛07 Sewage Treatment(二分+网络流)
  13. 人大金仓数据库的备份与还原 KingbaseES V8R6
  14. 盲人怎么用计算机打字,盲人打字键盘指法练习技巧和方法
  15. React中获取地址栏传参
  16. minus oracle 顺序_oracle 两表数据对比---minus
  17. MATLAB计算二阶系统单位阶跃响应及在for循环中在图像加图例
  18. java 组织机构代码_JAVA实现社会统一信用代码校验的方法|chu
  19. 惠普光影精灵拆机换屏幕_惠普光影精灵3换电池小记
  20. java 时间戳 什么意思_java时间与时间戳

热门文章

  1. CAD软件版本过低无法打开CAD图纸
  2. 5款非常好用,劲爆得很的软件
  3. android壁纸gallery,Gallery下载-画廊Gallery快图浏览下载v8.0 安卓版-西西软件下载
  4. Java获取系统当前时间
  5. 【Python零基础】19天从零开始学Python——第三天条件语句
  6. redis队列优先级java实现_Redis 实现队列原理的实例详解
  7. 基于springboot的外星人电脑商城项目(四)(用户管理)
  8. dj java实现_学DJ还是学JAVA 那个未来更有前途?
  9. 学校计算机专业春联大全带横批,2016学校新年对联大全带横批
  10. 创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3。​ 要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算