目录
一、无连接应用程序丢包率测试
UDP的不可靠性使得基于该协议的应用程序在数据通信过程中不可避免地会遇到丢包现象。
一方面,网络拥塞导致路由器转发数据报文时丢失;另一方面,慢速设备来不及处理快速到达的数据报文,使得接收缓存溢出而丢包,等等。在应用程序开发前,设计者需要对当前的网络状况和主机性能进行测试,以确定选择哪种协议承载运输、使用循环方式还是并发方式处理网络通信等等,其中丢包率测试是常用的项目,它可以辅助设计者对程序的可靠性进行直观的探测和诊断。
使用数据报套接字编程,在网络功能框架的基础上对回射服务器和客户端进行修改,实现丢包率测试工具。其中,服务器能够接收客户端发来的数据,统计数据报个数;客户端能够根据用户的指示向服务器批量发送数据。丢包率的计算公式如下:
丢包率=1-(服务器收到的报文个数/客户端发送的报文个数)×100%
要求实现接收缓存大小的修改功能,控制接收数据包的速度,能够给服务器在接收缓存
取不同值时丢包率的变化。画出数据表格,并给出分析。
二、UDP 丢包率测试服务端
//丢包率测试,服务器端
#define NETWORK2_2_COMM_H
#define NETWORK2_2_COMM_H
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#include <inaddr.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")
#define MAXLINE 4096 // 接收缓冲区长度
#define SEVER_PORT 13131 //
int SETBUFF = 128; // 设置缓冲区大小
int RECVTIMEOUT = 1; // 设置服务器收包超时时间(ms)
/*套接字初始化*/
int StartUp()
{
WORD w_version = MAKEWORD(2, 2);
WSADATA wsa_data;
int res = WSAStartup(w_version, &wsa_data);
if (res != 0)
{
printf("WSAStartup Error:%d\n",WSAGetLastError());
return -1;
}//版本号错误
if (LOBYTE(wsa_data.wVersion) != 2 || HIBYTE(wsa_data.wVersion) != 2)
{
printf("WSAStartup Error:%d\n",WSAGetLastError());
WSACleanup();
return -1;
}
return 0; //成功返回0
}
/*释放资源*/
int cleanUp()
{
int res = WSACleanup();
if (res == SOCKET_ERROR)
{
printf("WSACleanup Error:%d",WSAGetLastError());
return -1;
}
return 0;
}
/*断开连接,释放资源*/
int closeConn(SOCKET sock_conn)
{
int res = closesocket(sock_conn); //关闭连接
if (res == SOCKET_ERROR)
{
printf("关闭连接失败%d\n",WSAGetLastError());
return -1;
}
res = cleanUp();
return res;
}
/*服务器初始化*/
SOCKET udpServerInit(int port)
{
int res = -1;
SOCKET sock_listen;
const int on = 1;
// 绑定地址、端口
struct sockaddr_in server_addr;
memset(&server_addr,</