udp服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
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