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

qrt*_*tt1 4 c sockets select

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

dwc*_*dwc 5

您想要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 */
Run Code Online (Sandbox Code Playgroud)

但这是与套接字不再连接时不同的问题。如果您已经在使用select()或者poll()那么您就快成功了。如果您在 中指定并在 中检查它,poll()将很好地返回状态。POLLERReventsrevents

如果您正在执行正常的阻塞 I/O,那么只需在读/写错误出现时对其进行处理并正常恢复即可。