在Linux上开发,需要用到UDP通信,从网上找来一段UDP Server代码(
猛击这里查看),监听UDP端口,循环不断地接收数据并打印到标准输出。编译没有大的问题,可运行后死活接收不到数据。调了一下午再加晚上加班终于解决了:
(1)先是在发送端主机上用Wireshark抓包,确认数据发了出来(发送端用的“网络调试助手”);
(2)抓包时发现如果接收端程序不运行,那么发送端会收到ICMP destination port unreachable,接收端程序运行了就不会收到——这说明接收端监听是正常的;
(3)偶然发现,如果用测试工具自动连续向运行程序的主机发送数据包,主机会每隔一段时间一次性的打出大量数据——这说明程序收到了数据;
(4)修改接收到数据以后的处理方式,不打印数据内容,只打印数据包的数量,再测试,发现居然正常了——测试工具每发送一个数据包,接收端就打印一条记录;将打印数据内容的代码再加上,仍然正常;
(5)那么之前到底是哪里有问题呢?反复思考后终于发现,原来每次收到数据后printf()打印内容的最后没有加"\n",只要加了"\n",数据包内容就能正常输出了。
-
while(1)
-
{
-
z = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&adr_clnt, &len);
-
if (z < 0)
-
{
-
perror("recvfrom 出错");
-
exit(1);
-
}
-
buf[z] = 0;
-
printf("接收:%s\n",buf);//问题就出在这里,原来的代码printf的第一个参数最后没有 \n
-
-
if (strncmp(buf, "stop", 4) == 0)
-
{
-
printf("结束..\n");
-
break;
-
}
-
}
这是为什么呢?
阅读(2746) | 评论(4) | 转发(0) |