使用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
时的预期行为还是我遗漏了什么?
答案 0 :(得分:3)
这是预期的行为。正如the documentation所述,winsock的select
函数仅适用于套接字,stdin
不是套接字。
如果你打电话给WSAGetLastError
,你无疑会发现原因是
WSAENOTSOCK
其中一个描述符集包含一个不是套接字的条目。
尝试WSAEventSelect
和WaitForMultipleObjectsEx
;后者还可以等待普通文件句柄以及正常文件句柄上未完成读取操作的OVERLAPPED事件对象。