免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2985 | 回复: 5

[函数] 关于recvfrom()系统调用的问题 [复制链接]

论坛徽章:
0
发表于 2010-06-16 12:55 |显示全部楼层
第四个参数要一个socklen_t的地址,手册中说函数返回时,系统会根据地址的实际长度修改这个值。
我的问题是,在实际程序中,这个值怎么会改变呢?

比如说,我编写一个UDP传输文件的程序,client端发送一个path请求,server端用recvfrom()函数接受这个请求,得到client的地址,然后把文件分包发送回得到的client的地址。

既然已经订好了使用udp协议了,地址的那个结构体不就定下来了吗?就是struct sockaddr_in阿,那他的长度sizeof(struct sockaddr_in)不是也就固定了吗?我按照sizeof(struct sockaddr_in)初始化recvfrom()函数的第四个参数,他返回的时候怎么会修改这个值呢?

那么这第四个参数设计成这个样子,他的动机是什么呀,啥时候会改变呢?

谢谢。

论坛徽章:
0
发表于 2010-06-16 16:10 |显示全部楼层
确实是这样子的,我是这么理解的:在我的使用过程中这个参数的值确实就是已经定的,不会改变,但是还有的情况是可能会变,如果可能变,那就得重新获取地址的长度。

论坛徽章:
0
发表于 2010-06-16 16:20 |显示全部楼层
确实是这样子的,我是这么理解的:在我的使用过程中这个参数的值确实就是已经定的,不会改变,但是还有的情况是可能会变,如果可能变,那就得重新获取地址的长度。rain_fish 发表于 2010-06-16 16:10



就是说把第四个参数作为一种校验手段吗?如果不一致,就认为发生某种错误了,然后re-do?

论坛徽章:
0
发表于 2010-06-16 21:59 |显示全部楼层
恩,应该是这样子的,还请高手继续释疑。。。

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2010-06-17 08:36 |显示全部楼层
应该是为了适应兼容其他协议而留的,譬如出来一种协议地址信息比较长,超过现在的,不判断就要溢出了

论坛徽章:
0
发表于 2010-06-17 18:34 |显示全部楼层
应该是为了适应兼容其他协议而留的,譬如出来一种协议地址信息比较长,超过现在的,不判断就要溢出了
hellioncu 发表于 2010-06-17 08:36



可是不管出什么协议,使用它的时候,地址结构体不是也就定下来了么——我的意思是:咱们不会真的去用那个变长结构体 struct sockaddr加上长度去接收地址吧,一定是用一个已知的定长的结构体,譬如说 struct sockaddr_in。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP