使用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
其中一个描述符集包含一个不是套接字的条目。
尝试WSAEventSelect
和WaitForMultipleObjectsEx
; 后者也可以在正常的文件句柄上等待来自正常文件句柄上未完成读操作的OVERLAPPED事件对象。