在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。