2012-09-26 43 views

回答

1

通常,當另一端的連接關閉或發送RST段時,select會返回並將相應的描述符標記爲準備好讀取。當您隨後從它們執行read/recv時,會返回錯誤或EOF。

您也可以嘗試使用strace工具(如果可用)進行調試。它將幫助您跟蹤哪些描述符被輸入到select以及使用什麼描述符調用read/recv

+0

在代碼一旦我面對這個錯誤...如果我遍歷fdset中的每個fd,並做每個fcntl()我將能夠找到哪個fd已經失效。 – user1495948

+0

通常,您遍歷所有在結果讀取fdset中標記爲ready的描述符,並從中讀取所需的數據。如果在讀取之後碰巧讀取了'-1'(或0,表明對等關閉了套接字),這意味着發生了錯誤,並且在下一次調用select之前,不應該包含此描述符來讀取fdset。 –

+0

不,如果我在fdset中的每個fd上選擇..ill do fcntl時遇到錯誤,是否有幫助? – user1495948

0

您可以在插座上檢查掛起的錯誤有以下功能:

int get_socket_error(int s) { 
    int error; 
    socklen_t len = sizeof(error); 
    if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len) < 0) 
     error = errno; 
    return error; 
} 

但作爲@Maxim是說,有來自select(2)返回EBADF通常是一個草率的編碼的指示,

+0

ok..1基本問題...是否有可能通過fdset進行迭代..我知道fdset的結構...找不到它。 – user1495948

+0

通常情況下,fdset是一個位圖,其中每個位顯示描述符是否準備就緒。但是,您不應該依賴fdset的內部實現並使用宏來操作它('FD_ISSET'等)。通常的方法是從0到'max_fd + 1'循環檢查'FD_ISSET'宏是否描述符已準備好進入IO。你正在迭代的當前變量包含一個文件描述符。 –

+0

如果你在Linux上,切換到'epoll(7)'。您不必在每次迭代中重新填充等待列表,並且'close(2)'-ed套接字將自動從輪詢集中移除。 –

相關問題