在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。
老大啊,问题其实很简单。你如果仔细读一下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是意料之中的事。。。。
我把测试代码上传了算了,你看看。
每次运行程序,第一次打出的地址都是全零~很郁闷,只要有了一次,以后就没有这样的问题了。
是什么让你判断出“是没有获得任何数据的”?你是不是用的64位系统?在64位上accept的最后一个参数似乎有问题。
Btw,你最好把代码贴出来。