invalid argument in select() when peer socket is in FD_SET

Christoph P.U. Kukulies kuku at kukulies.org
Sun Jul 31 16:19:45 UTC 2011


Am 31.07.2011 17:45, schrieb Jilles Tjoelker:
> On Sun, Jul 31, 2011 at 04:20:08PM +0200, Christoph P.U. Kukulies wrote:
>> I posted this on freebsd-questions also but maybe the expert density
>> isn't that high as here in "hackers".
>> Since I think it may be a design or implementation issue in FreeBSDs'
>> select(), I'm posting it here as well,
>> hoping to get an experts' answer.
>> I have written a small server to test TCP/IP roundtrip times of the
>> packets in a proprietary protocol and while
>> compiling and running this server on different platforms (Windows
>> 7/cygwin, UbuntuLinux, FreeBSD 8.0 Release), I found
>> that the server produces an error when the listening socket (on which
>> the accept() is performed) is also
>> member of the select() fd_set.
>> On the other platforms the program works without error, just under
>> FreeBSD I'm getting this "invalid argument" error.
>> Comments appreciated (despite comments about the error checking logic
>> [snip]
>>       tv.tv_sec = 0;
>>       tv.tv_usec = 5000000;       /* 5 seconds */
>> [snip]
>>           n = select(nfds,&readfds,
>>                      (fd_set *) NULL,     /* not interested in write */
>>                      (fd_set *) NULL,     /* ...or exceptions */
>> &tv);        /* timeout */
> The number of microseconds in a struct timeval must be nonnegative and
> less than one million (likewise, the number of nanoseconds in a struct
> timespec must be nonnegative and less than 1000 million).
>
> FreeBSD checks this strictly in most functions.

Ah, thanks. That's another plus for FreeBSD.  Somehow I have been 
mislead during the development of
the sample server that it escaped to me, that the timestruct was the 
culprit.

Thanks again. saved me a lot of headaches.

--
Christoph




More information about the freebsd-hackers mailing list