2012-01-07 88 views
0

使用Winsock2下面的代碼序列爲select()返回-1(失敗)。Winsock2在fd 0(stdin)上的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還是我失去了一些東西時,這是預期的行爲?

回答

3

這是預期的行爲。正如全文提到的the documentation,winsock的select函數只適用於套接字,並且stdin不是套接字。

如果你曾打電話WSAGetLastError,你肯定會發現,原因是

WSAENOTSOCK一個描述符集包含一個項,它不是一個套接字。

嘗試WSAEventSelectWaitForMultipleObjectsEx;後者也可以在正常的文件句柄上等待來自正常文件句柄上的未完成讀操作的OVERLAPPED事件對象。

+0

我確實調用了WSAGetLastError(),從它的結果我有一個預感我錯誤的路徑。所以謝謝你承認這一點。 – alk 2012-01-07 23:14:05

相關問題