Winsock2在fd 0(stdin)上的select()失败

时间:2012-01-07 23:00:26

标签: c windows select winsock2

使用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时的预期行为还是我遗漏了什么?

1 个答案:

答案 0 :(得分:3)

这是预期的行为。正如the documentation所述,winsock的select函数仅适用于套接字,stdin不是套接字。

如果你打电话给WSAGetLastError,你无疑会发现原因是

  

WSAENOTSOCK 其中一个描述符集包含一个不是套接字的条目。

尝试WSAEventSelectWaitForMultipleObjectsEx;后者还可以等待普通文件句柄以及正常文件句柄上未完成读取操作的OVERLAPPED事件对象。