关于recvfrom()的返回值问题

晖晖要运动 2011-09-19 02:37:24

//.................
while(1)
{
memset(buf, 0, 1024*5); //因为接收的数组很大,800-4000不等
devaddr_len = sizeof(devaddr);
n = recvfrom(udpfd, buf, 1024*5, 0, (struct sockaddr *)&devaddr, &devaddr_len);
if (n == -1)
{
printf("recive data error: %s(errno: %d) \n",strerror(errno),errno);
exit(1);
}
printf(" 接收数据长度: %d \n",n);
}


recvfrom()的返回值应当是接受的字符数组的长度。
然而,对端发送的字符数组里面有用来标识长度的字节,用于检验接收的字符数组是否完整。

问题出现了:50%的情况下,返回值与对端发送的长度是相同的。

50%的情况,是不相同的,但是,问题是,接收到的长度全都比发送的字符数组的长度大256!!!

这是怎么回事呢? UDP的不可靠性,是指会丢失一些数组,还是丢失一个数组里面的一些部分?
但是,就算丢失,为什么反而增加了呢,而且多256!!!

帮忙解答下呀,谢啦!
...全文
2219 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-09-20
  • 打赏
  • 举报
回复
直接发结构体....

结构体有内存对齐的...

不是你算的int+int+(xxx+yyy)....
yanran_hill 2011-09-20
  • 打赏
  • 举报
回复
UDP包能够保证本次数据的完整发送,或者是失败的时候包被丢弃
你应当去发送端程序去检查原因,或者使用sniffer工具查看网络的原始数据
晖晖要运动 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanran_hill 的回复:]

UDP包能够保证本次数据的完整发送,或者是失败的时候包被丢弃
你应当去发送端程序去检查原因,或者使用sniffer工具查看网络的原始数据
[/Quote]


意思是不是可能会收不到,但是收到的必是完整的?

就算是不完整,为什么总是多出256个字符呢。。。。

您的经验能告诉我可能的原因吗?
mayer 2011-09-19
  • 打赏
  • 举报
回复
而上次接收一次接收的内容大小 ==> 而上层接收一次接收的内容大小

对你的数据进行编号,就是在发送的时候对自己的数据进行封包,简单的可以如下:

struct _my_package
{
int i4_header; /*一个特殊的包头标记,用来寻找每个包*/
int i4_pkg_id; /*包id,用来接收端组合包得到需要的数据*/
char c_data[XXX]; /*数据部分*/
char c_verify_code[YYY]; /*数据校验,可能不需要*/
}
mayer 2011-09-19
  • 打赏
  • 举报
回复
可能会增加的哦,比如TCP/IP底层以1 2 3 4 5 6 7 8这样编号顺序来发送包,而上次接收一次接收的内容大小可能为 这8个包的大小的总和那么多,当丢失其中几个包比如 2 3 4 5 6 7的时候,接收的到的可能是 1 8 9 10 。。。 后面的包的内容,当然还不考虑乱序的情况。
如果要实现可靠通信,建议用面向连接的通信方式,不要用无连接的。如果一定要用这个,建议你在发送数据的时候自己来给发送的包编号,并且在接收端进行校验,然后如果有丢失,需要通知那边重传丢失的部分

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧