cwindowswinsock2posix-select

Winsock2's select() on fd 0 (stdin) fails


Using Winsock2 the code sequence below returns -1 (failure) for select().

#include <Winsock2.h>
#include <stdio.h>

...

int rc;
int fdstdin = fileno(stdin); /* returns 0 as expected */
fd_set fds;

FD_ZERO(&fds);
FD_SET(fdstdin, &fds);

rc = select(1, &fds, NULL, NULL, NULL);

...

Is this the expected behaviour when using Winsock2 or am I missing something?


Solution

  • This is expected behavior. As mentioned all over the documentation, winsock's select function only works on sockets, and stdin is not a socket.

    If you had called WSAGetLastError, you undoubtedly would have found that the cause was

    WSAENOTSOCK One of the descriptor sets contains an entry that is not a socket.

    Try WSAEventSelect and WaitForMultipleObjectsEx; the latter can also wait on normal file handles as well as OVERLAPPED event objects from outstanding read operations on normal file handles.