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

使用Winsock2下面的代码序列为select()返回-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时的预期行为,还是我错过了一些东西?

这是预期的行为。 正如在文档中提到的那样 ,winsock的select函数只能在套接字上运行,而stdin不是套接字。

如果你调用了WSAGetLastError ,你无疑会发现原因是

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

尝试WSAEventSelectWaitForMultipleObjectsEx ; 后者也可以在正常的文件句柄上等待来自正常文件句柄上未完成读操作的OVERLAPPED事件对象。