Winsock2 select() на fd 0 (stdin) терпит неудачу

При использовании Winsock2 кодовая последовательность ниже возвращает -1 (сбой) для 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);

...

Это ожидаемое поведение при использовании Winsock2 или я что-то упустил?


person alk    schedule 07.01.2012    source источник


Ответы (1)


Это ожидаемое поведение. Как упоминалось во всей документации, только функция winsock select работает с сокетами, а stdin не является сокетом.

Если бы вы позвонили WSAGetLastError, вы, несомненно, обнаружили бы, что причина

WSAENOTSOCK Один из наборов дескрипторов содержит запись, которая не является сокетом.

Попробуйте WSAEventSelect и WaitForMultipleObjectsEx; последний также может ожидать на обычных файловых дескрипторах, а также на объектах событий OVERLAPPED от незавершенных операций чтения на обычных файловых дескрипторах.

person Ben Voigt    schedule 07.01.2012
comment
Я вызвал WSAGetLastError(), и по его результату у меня появилось предчувствие, что я на неправильном пути. Так что спасибо, что признали это. - person alk; 08.01.2012