Chinaunix首页 | 论坛 | 博客
  • 博客访问: 508931
  • 博文数量: 68
  • 博客积分: 2492
  • 博客等级: 大尉
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-02 16:30
个人简介

承接移动应用(iOS、Android、WP),桌面应用(VC++、C#、VB、Qt)和嵌入式软件(单片机、ARM)开发。欢迎接洽。QQ:2335301794,E-mail:rabbitom@gmail.com。

文章分类

全部博文(68)

文章存档

2016年(1)

2015年(2)

2014年(4)

2013年(6)

2012年(1)

2011年(8)

2010年(16)

2009年(8)

2008年(10)

2007年(12)

我的朋友

分类: C/C++

2014-02-18 22:10:38

在Linux上开发,需要用到UDP通信,从网上找来一段UDP Server代码(猛击这里查看),监听UDP端口,循环不断地接收数据并打印到标准输出。编译没有大的问题,可运行后死活接收不到数据。调了一下午再加晚上加班终于解决了:
(1)先是在发送端主机上用Wireshark抓包,确认数据发了出来(发送端用的“网络调试助手”);
(2)抓包时发现如果接收端程序不运行,那么发送端会收到ICMP destination port unreachable,接收端程序运行了就不会收到——这说明接收端监听是正常的;
(3)偶然发现,如果用测试工具自动连续向运行程序的主机发送数据包,主机会每隔一段时间一次性的打出大量数据——这说明程序收到了数据;
(4)修改接收到数据以后的处理方式,不打印数据内容,只打印数据包的数量,再测试,发现居然正常了——测试工具每发送一个数据包,接收端就打印一条记录;将打印数据内容的代码再加上,仍然正常;
(5)那么之前到底是哪里有问题呢?反复思考后终于发现,原来每次收到数据后printf()打印内容的最后没有加"\n",只要加了"\n",数据包内容就能正常输出了。

  1. while(1)
  2.     {
  3.         z = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&adr_clnt, &len);
  4.         if (z < 0)
  5.         {
  6.             perror("recvfrom 出错");
  7.             exit(1);
  8.         }
  9.         buf[z] = 0;
  10.         printf("接收:%s\n",buf);//问题就出在这里,原来的代码printf的第一个参数最后没有 \n 

  11.         if (strncmp(buf, "stop", 4) == 0)
  12.         {
  13.             printf("结束..\n");
  14.             break;
  15.         }
  16.     }
这是为什么呢?
阅读(2746) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

liucencen2014-02-20 10:06:00

我也遇到过这个问题,这和缓冲区的设置有关,可以设置成缓冲区满之后输出,或满一行之后输出,或是无缓冲区。你这样的情况是缓冲区的设置是满一行以后输出缓冲区内容

bg2bkk2014-02-19 21:18:35

需要清空缓存

wwx07152014-02-19 12:40:54

与缓冲模式有关,默认是行缓冲的,需要回车才会真正输出。
setvbuf可以配置缓冲模式

初识orcl2014-02-19 10:49:42

细节啊