免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: darkslack
打印 上一主题 下一主题

如何循环接受数据(recvfrom ) [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2007-09-29 14:04 |只看该作者
原帖由 darkslack 于 2007-9-29 14:03 发表
对呀,所以我才问如何得到全部的数据吗!!
因为服务器发送的数据长度不确定,所以不可能定义MAX啊
如果服务器发的数据比MAX(比如MAX=12345678)多(123456789)
那怎么得到服务器的数据呢?

不确定就取最大。
而最大绝对不可能无限大。
事实上,超过 1.4k 就有可能出问题。你测试一下吧。
MAX 定成 2048 足够了。再不行就 4096

论坛徽章:
0
12 [报告]
发表于 2007-09-29 14:08 |只看该作者
对了,应该在服务器端控制sendto。。

论坛徽章:
0
13 [报告]
发表于 2007-09-29 14:12 |只看该作者
tcp/ip 详解卷1第11章第10节:

理论上,I P数据报的最大长度是6 5 5 3 5字节,这是由I P首部(图3 - 1)1 6比特总长度字段所
限制的。去除2 0字节的I P首部和8个字节的U D P首部, U D P数据报中用户数据的最长长度为
6 5 5 0 7字节。但是,大多数实现所提供的长度比这个最大值小。
我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提
供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个
长度与应用程序可以读写的最大U D P数据报的长度直接相关。现在的大部分系统都默认提供
了可读写大于8 1 9 2字节的U D P数据报(使用这个默认值是因为8 1 9 2是N F S读写用户数据数的
默认值)。
第二个限制来自于T C P / I P的内核实现。可能存在一些实现特性(或差错),使I P数据报长
度小于6 5 5 3 5字节。



另外, 还有一个限制是书中没有提到的,就是如果发送和接收端处在不同的网络中,还会受到路由器(防火墙)的限制.例如UDP负载超出MTU大小,而需要分片发送,则可能会被拦截掉分片的ip包(为了更安全,更和谐).从而在接收端无法还原udp包,而造成该包的丢弃.

论坛徽章:
0
14 [报告]
发表于 2007-09-29 14:25 |只看该作者
据说用和MTU接近的,效率要高一点,数据包太大,如果掉了分片中的一部分,整个包就没用了,浪费也大,要知道UDP是不可靠传输的。单次发送的包太大,丢包造成的浪费也越大。

论坛徽章:
0
15 [报告]
发表于 2007-09-29 17:32 |只看该作者
定义65536好了。
在现在的机器上,64K的内存还是浪费得起的。资源实在紧张另说。

论坛徽章:
0
16 [报告]
发表于 2007-09-29 18:10 |只看该作者
原帖由 darkslack 于 2007-9-29 13:56 发表
怎么不行啊?如果服务器发送100字节,第一次recvfrom时收到十个字节,第二次收
n就是0;  MAX为10仅仅是演示
#define MAX 10
int n;
int total;
char recvdata[MAX];
char *data=NULL;
  while(1){
   ...

代码好像有error

论坛徽章:
0
17 [报告]
发表于 2007-09-29 18:14 |只看该作者
严重抗议楼上的贴自己的相片

论坛徽章:
0
18 [报告]
发表于 2007-09-29 18:15 |只看该作者
原帖由 epegasus 于 2007-9-29 18:14 发表
严重抗议楼上的贴自己的相片

幸亏没贴你的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP