Linux的socket的奇怪问题

在Linux下使用一个TCP Socket进行Listen的时候,最近发现一个诡异的问题。

accept(2)是可以接受一个sockaddr指针来返回一个远端主机的地址,但是,实际情况是,如果这个连接是这个程序第一次发生的时候,是没有获得任何数据的,从第二次开始就没有这个问题,也就是紧跟这accept函数使用一个getpeername(2),即可以得到连接的主机的IP地址,从这以后开始的连接都没有这个问题。可是,如果accept中如果用accept(sock_fd,NULL,NULL)这样的形式,来使accept(2)不返回远端主机地址的情况下,第一次getperrname函数也是什么都得不到的。

这个问题在我现在能测试的平台有Linux 2.4.20, glibc-2.3, Linux 2.6.18 glibc-2.3, Linux 2.6.20-21, glibc 2.7都有这个问题,不知道是不是socket实现的bug。

测试代码

《Linux的socket的奇怪问题》有3条评论

  1. 老大啊,问题其实很简单。你如果仔细读一下accept(2)的手册你就会发现:

    The addrlen argument is a value-result argument: it should initially contain the size of the structure pointed to by addr;

    你的addrlen第一次是0,返回0是意料之中的事。。。。

    回复
  2. 我把测试代码上传了算了,你看看。
    每次运行程序,第一次打出的地址都是全零~很郁闷,只要有了一次,以后就没有这样的问题了。

    回复
  3. 是什么让你判断出“是没有获得任何数据的”?你是不是用的64位系统?在64位上accept的最后一个参数似乎有问题。

    Btw,你最好把代码贴出来。

    回复

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据