如果我有一个文件描述符(socket fd),如何检查这个fd是否可用于读/写? 在我的情况下,客户端已连接到服务器,我们知道fd。 但是,服务器会断开套接字,是否有任何线索可以检查它?
答案 0 :(得分: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()
,那么您几乎就在那里。如果您在poll()
中指定POLLERR
并在events
中进行检查,则revents
会很好地返回状态。
如果您正在进行正常的阻塞I / O,那么只需处理读/写错误,它们会进入并正常恢复。
答案 1 :(得分:0)
您可以使用select()
或poll()
。
答案 2 :(得分:0)
在C#中,这个问题已经回答here
通常,套接字断开是异步的,需要以某种方式进行轮询。如果套接字关闭,则套接字上的异步读取通常会返回,这样您就有机会更快地获取状态更改。 Winsock(Windows)能够注册以接收断开连接的通知(但同样,这可能不会在另一方“消失”后很长一段时间内发生,除非您使用某种类型的'keepalive'(SO_KEEPALIVE,通过默认情况下可能不会注意数小时或应用程序级心跳。
答案 3 :(得分:0)
我发现recv可以检查。当socket fd坏的时候,设置了一些errno。
ret = recv(socket_fd, buffer, bufferSize, MSG_PEEK);
if(EPIPE == errno){
// something wrong
}
答案 4 :(得分:-1)
好吧,你可以调用select()。如果服务器断开连接,我相信你最终会得到一个错误代码返回...如果没有,你可以使用select()告诉你网络堆栈是否准备好发送更多数据(或接收它)。 / p>