在服務器端,在readfds上執行select()時,它將返回錯誤的文件描述符錯誤。如何找到哪個fd在fdset中變得無效?如何查找哪個套接字描述符在fdset中變得無效
回答
通常,當另一端的連接關閉或發送RST段時,select
會返回並將相應的描述符標記爲準備好讀取。當您隨後從它們執行read
/recv
時,會返回錯誤或EOF。
您也可以嘗試使用strace
工具(如果可用)進行調試。它將幫助您跟蹤哪些描述符被輸入到select
以及使用什麼描述符調用read
/recv
。
您可以在插座上檢查掛起的錯誤有以下功能:
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
通常是一個草率的編碼的指示,
ok..1基本問題...是否有可能通過fdset進行迭代..我知道fdset的結構...找不到它。 – user1495948
通常情況下,fdset是一個位圖,其中每個位顯示描述符是否準備就緒。但是,您不應該依賴fdset的內部實現並使用宏來操作它('FD_ISSET'等)。通常的方法是從0到'max_fd + 1'循環檢查'FD_ISSET'宏是否描述符已準備好進入IO。你正在迭代的當前變量包含一個文件描述符。 –
如果你在Linux上,切換到'epoll(7)'。您不必在每次迭代中重新填充等待列表,並且'close(2)'-ed套接字將自動從輪詢集中移除。 –
- 1. 如何查找vxworks中套接字描述符的狀態
- 2. Linux套接字描述符
- 3. 爲什麼此套接字/文件描述符分配無效?
- 4. Linux:如何獲得套接字描述符的TCP套接字選項?
- 5. 套接字描述符與文件描述符
- 6. 如何查詢文件描述符的套接字類型?
- 7. 哪個NSCharacterSet描述在tel:URL中有效的字符?
- 8. libevent無法讀取一個打開的套接字描述符
- 9. 需要獲取套接字描述符
- 10. C++文件描述符(套接字)isopen()?
- 11. 套接字壞文件描述符
- 12. 文件/套接字描述符表
- 13. 套接字和文件描述符
- 14. 監視套接字描述符
- 15. 如何查找描述的最後一個「|」字符
- 16. 如何找到一個字符串描述類在Java中
- 17. Rspec:PG :: ConnectionBad:PQsocket()無法獲取套接字描述符
- 18. 套接字描述符泄漏 - lsof無法識別協議?
- 19. 無法獲取文件描述符從零MQ ZMQ_SERVER套接字
- 20. 文件描述符和套接字文件描述符之間的區別
- 21. 套接字描述符基本上是文件描述符的同義詞嗎?
- 22. 如何檢索升壓asio套接字文件描述符
- 23. select()如何等待常規文件描述符(非套接字)?
- 24. 檢查套接字文件描述符是否可用?
- 25. 如何找到哪個文件描述符導致SIGPIPE?
- 26. 在python中更改套接字的文件描述符
- 27. 如何找到與套接字描述符關聯的文件名?
- 28. 關於處理超過1024個套接字描述符
- 29. 套接字文件描述符> FD_SETSIZE在OS X上有效嗎?
- 30. 如何在JNI中找到對象的字段描述符?
在代碼一旦我面對這個錯誤...如果我遍歷fdset中的每個fd,並做每個fcntl()我將能夠找到哪個fd已經失效。 – user1495948
通常,您遍歷所有在結果讀取fdset中標記爲ready的描述符,並從中讀取所需的數據。如果在讀取之後碰巧讀取了'-1'(或0,表明對等關閉了套接字),這意味着發生了錯誤,並且在下一次調用select之前,不應該包含此描述符來讀取fdset。 –
不,如果我在fdset中的每個fd上選擇..ill do fcntl時遇到錯誤,是否有幫助? – user1495948