如果我有一個文件描述符(套接字fd),如何檢查此fd是否適用於讀/寫? 在我的情況下,客戶已連接到服務器,我們知道fd。 但是,服務器會斷開socket連接,有沒有什麼線索可以檢查它?檢查套接字文件描述符是否可用?
3
A
回答
4
你想fcntl()
檢查讀/寫設置在FD:
#include <unistd.h>
#include <fcntl.h>
int r;
r = fcntl(fd, F_GETFL);
if (r == -1)
/* Error */
if (r & O_RDONLY)
/* Read Only */
else if (r & O_WRONLY)
/* Write Only */
else if (r & O_RDWR)
/* Read/Write */
但是,這是指從插座不再連接一個單獨的問題。如果你已經在使用select()
或poll()
那麼你幾乎就在那裏。如果您在events
中指定POLLERR
並在revents
中檢查它,poll()
將很好地返回狀態。
如果您正在執行正常的阻塞I/O,那麼只需在處理讀取/寫入錯誤時進入並正常恢復。
0
您可以使用select()
或poll()
。
-1
那麼,你可以調用select()。如果服務器斷開連接,我相信你最終會得到一個返回的錯誤代碼。如果沒有,你可以使用select()來告訴你網絡堆棧是否準備發送更多數據(或接收它)。
0
在C#,這個問題得到解答here
一般來說,插座斷開是異步的,並且需要被輪詢以某種方式。如果套接字上的異步讀取通常會關閉,那麼通常會返回該信息,從而使您有機會更快地獲取狀態更改。 Winsock(Windows)有能力註冊接收斷開連接的通知(但是,在另一方「消失」之後,這可能不會發生很長時間),除非您使用某種類型的「keepalive」(SO_KEEPALIVE,由默認情況下可能不會注意到幾個小時,或應用程序級的心跳)。
0
我發現的recv可以檢查。當套接字fd是壞的,有些errno設置。
ret = recv(socket_fd, buffer, bufferSize, MSG_PEEK);
if(EPIPE == errno){
// something wrong
}
+0
EPIPE並不意味着套接字FD是壞的,這意味着連接中斷,不是一回事。 – EJP 2016-12-13 23:33:02
相關問題
- 1. 套接字描述符與文件描述符
- 2. C++文件描述符(套接字)isopen()?
- 3. 套接字壞文件描述符
- 4. 文件/套接字描述符表
- 5. 套接字和文件描述符
- 6. Linux系統:檢查是否文件描述符可以讀取
- 7. 套接字描述符基本上是文件描述符的同義詞嗎?
- 8. Linux套接字描述符
- 9. 文件描述符和套接字文件描述符之間的區別
- 10. 什麼是文件描述符/連接/套接字/ IP?
- 11. 如何檢索升壓asio套接字文件描述符
- 12. 檢查IniFile描述符是否打開
- 13. 如何查詢文件描述符的套接字類型?
- 14. 在Linux中創建新線程是否重複文件描述符和套接字描述符?
- 15. 檢查文件描述符是否有效
- 16. Linux內核 - 檢查是否有文件描述符
- 17. 如何檢查文件描述符是否有可用的數據?
- 18. 如何確定文件描述符是否可查找?
- 19. 使用close()套接字(C++)的錯誤文件描述符
- 20. Linux套接字文件描述符通常適用於散列
- 21. 如何檢查文件是否仍然存在使用文件描述符
- 22. 使用Linux套接字寫入錯誤文件描述符()錯誤文件描述符C
- 23. 是否EXEC保存文件描述符
- 24. fopen是否創建文件描述符?
- 25. 需要獲取套接字描述符
- 26. 監視套接字描述符
- 27. 套接字對非套接字或錯誤文件描述符的操作
- 28. 檢測文件描述符是否是solaris 11.0中的套接字,並提取ip地址
- 29. 爲什麼此套接字/文件描述符分配無效?
- 30. 帶有BSD套接字的錯誤文件描述符
我想`select`可能引發如果遠端斷開,* exceptfds *參數不會返回任何錯誤 – 2011-04-12 12:53:25