如果我有一个文件描述符(套接字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