2009-05-21 113 views
3

如果我有一个文件描述符(套接字fd),如何检查此fd是否适用于读/写? 在我的情况下,客户已连接到服务器,我们知道fd。 但是,服务器会断开socket连接,有没有什么线索可以检查它?检查套接字文件描述符是否可用?

回答

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

我想`select`可能引发如果远端断开,* exceptfds *参数不会返回任何错误 – 2011-04-12 12:53:25

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

相关问题