测试udp的丢包和乱序

      udp服务端代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
    struct sockaddr_in srvAddr;
    bzero(&srvAddr,sizeof(srvAddr));
    srvAddr.sin_family = AF_INET;
    srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    srvAddr.sin_port = htons(atoi(argv[1]));
    int srvAddrLen = sizeof(srvAddr);

    int iSock = socket(AF_INET, SOCK_DGRAM, 0);  // udp
    int iRet = bind(iSock, (struct sockaddr *)&srvAddr, sizeof(srvAddr));

    while(1)
    {
		struct sockaddr_in cliAddr;
		bzero(&cliAddr,sizeof(cliAddr));
		cliAddr.sin_family = AF_INET;
		int cliAddrLen = sizeof(cliAddr);
		char szBuf[1024] = {0};
        recvfrom(iSock, szBuf, sizeof(szBuf) - 1, 0, (struct sockaddr *)&cliAddr, (socklen_t*)&cliAddrLen); 
		
        printf("%s\n", szBuf);
    }

    close(iSock);
    return 0;
}

      udp客户端代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char **argv)
{
    struct sockaddr_in srvAddr;
    bzero(&srvAddr, sizeof(srvAddr));
    srvAddr.sin_family = AF_INET;
    srvAddr.sin_addr.s_addr = inet_addr("100.66.17.151");
    srvAddr.sin_port = htons(atoi(argv[1]));

    int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp
	int i = 0;
    while(1)
    {
		char szBuf[32] = {0};
        snprintf(szBuf, sizeof(szBuf), "%d", ++i);
        sendto(iSock, szBuf, strlen(szBuf) + 1, 0, (struct sockaddr *)&srvAddr, sizeof(srvAddr));
    }

	close(iSock);
    return 0;
}

     客户端循环发包, 我们看看服务端的部分结果:

24559
24560
24561
24562
24563
24564
24565
24644
24645
24646
24647
24648

     统计了一下, 而是纯粹地丢了, 对, 丢了。 丢包率

     对100万行结果进行统计, 发现结尾的数据是:

1071166
1071167
1071168
1071169
1071170
1071171
1071172
1071173
1071174
1071175

      可见, 有7万的丢包, 丢包率7%, 继续看了一下, 没有发现有乱序。 其实, 乱序是可能发生的。

      另外, 如果降低发包速度,就没看到丢包了, 比如每100ms发包一次, 丢包率为0






你可能感兴趣的:(S1:,C/C++,s2:,软件进阶,s2:,网络编程,s2:,Linux编程,s2:,后台开发,s4:,计算机网络)