检查套接字文件描述符是否可用?

时间:2009-05-21 13:56:03

标签: c select sockets

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

5 个答案:

答案 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>