关于accept和getpeername的address_len参数的问题

来源:互联网 发布:龙岗区数据统筹办公室 编辑:程序博客网 时间:2024/06/06 11:46

socket编程中,难免会有需要取得对端信息的时候

socket本身给我们提供了两个方法,accept()和getpeername()

accept()

int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

socket:这里的socket是经过bind绑定地址过的socket,可以理解为服务器端的socket。之前有一个监听(listen)操作,accept算是它的后续操作,它们的操作对象都是同一个socket。

restrict address:这里的地址变量,用于保存对端的地址信息。

address_len:参数二restrict address的长度,在写入restrict address信息时,也会将写入信息的长度保存到此变量。注意:manpage里对这个参数有一个说明,在使用前必须要初始化,后面继续说明。

返回值:成功会返回对端的socket fd(非负),失败的话会返回-1.(此时获取errno,errmsg是一个好习惯)

getpeername()

 

int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

 

socket:这里的socket和accept中对应的socket有所不同,它应该是对端的socket。

restrict address:同上

address_len:同上


这里面关于address_len还涉及到一个问题,我就犯过这个错误:使用前,没有初始化。

仔细看看manpage,关于这个参数的,事实是这样的:

以accept为例,当accept收到了client的连接,会做两件事:

1,以address_len的值来写对端信息到restrict address,比如,address_len为1,那么对端的信息,只写1个字节到restrict address(或者因为信息长度为XX,大于1而根本就不写进去,这个可能性更大,有待考证)

2,实际上收到的对端的信息长度写到address_len

所以当你的address_len这个变量没有初始化的时候,其默认值为1(Fedora-16),无法把信息完整写入restrict address,造成没有获取到对端信息的假象。

 

 


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击