LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 730|回复: 4

使用recvfrom函数出现的一个奇怪的问题

[复制链接]
发表于 2005-2-5 16:59:46 | 显示全部楼层 |阅读模式
在使用UDP的时候发现收到的字节和buff里面有内容的字节大小不同。

这个是server端的代码,client向server发送“Message from client.”
  1. n = recvfrom(sockfd,buff,MAXLINE,0,(struct sockaddr*)&clientaddr,&clilen);
  2.     if(n > 0)
  3.     {
  4.    printf("%s %d %d\n",buff,n,strlen(buff));
  5.     }
复制代码


server收到后,把接收的内容打印出来。
运行结果是:
Message from client.i686 20 24
在Message from client.后面多了i686,这个为什么呢?内核为了凑够24个字节自己加上去的?
但如果把“.”去掉的话,结果就变成如下:
Message from client 19 19
 楼主| 发表于 2005-2-5 17:14:04 | 显示全部楼层
找到原因了,原来是buff的大小要是MAXLINE+1
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-5 17:24:52 | 显示全部楼层
但是如改变MAXLINE的大小,有出问题了
回复 支持 反对

使用道具 举报

发表于 2005-2-6 08:18:08 | 显示全部楼层
strlen所认为的字符串是以'\0'结尾的,如果你要把收到的东西当成字符串处理,要手工添加'\0'(除非接收的数据已经包含了)。

buff[n] = '\0';
回复 支持 反对

使用道具 举报

发表于 2005-2-6 20:25:56 | 显示全部楼层


  1. char buff[MAXLINE+1];
  2. memset(buf,0,MAXLINE+1);
  3. n = recvfrom(sockfd,buff,MAXLINE,0,(struct sockaddr*)&clientaddr,&clilen);
  4.     if(n > 0)
  5.     {
  6.   buff[n] = '\0';
  7.    printf("%s %d %d\n",buff,n,strlen(buff));
  8.     }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表