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

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

您希望fcntl()检查fd上的读/写设置:

 #include  #include  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指定POLLERRPOLLERR中检查它, poll()将很好地返回状态。

如果您正在进行正常的阻塞I / O,那么只需处理读/写错误,它们会进入并正常恢复。

您可以使用select()poll()

在C#中,这个问题在这里得到解答

通常,套接字断开是异步的,需要以某种方式进行轮询。 套接字上的异步读取通常会在它关闭时返回,这样您就有机会更快地了解状态更改。 Winsock(Windows)能够注册以接收断开连接的通知(但同样,这可能不会在另一方“消失”后很长一段时间内发生,除非你使用某种类型的’keepalive’(SO_KEEPALIVE,通过默认可能不会注意几个小时或应用程序级心跳)。

我发现recv可以检查。 当socket fd坏的时候,设置了一些errno。

 ret = recv(socket_fd, buffer, bufferSize, MSG_PEEK); if(EPIPE == errno){ // something wrong } 

好吧,你可以调用select()。 如果服务器断开连接,我相信你最终会得到一个错误代码返回…如果没有,你可以使用select()来告诉你网络堆栈是否已准备好发送更多数据(或接收它)。