c - 我应该在 select() EBADF 上断言失败吗?

标签 c sockets tcp

我正在尝试修复调用 select() 的事件循环中的错误。当 select() 返回 EBADF 时,会记录一个错误,然后重新初始化 fd 集并再次调用 select。这会导致日志记录的无限硬循环,在几秒钟内生成千兆字节的日志。

如果我的程序连接到的其中一个 tcp 服务器发生不正常的断开连接(例如,它出现段错误),则会发生此错误。在这种情况下,理想情况下我希望我的程序删除该 fd 并继续运行(如果不可行则关闭)。

我的问题是,select() 应该返回 EBADF,还是表明我的程序有问题? IE。我应该在 EBADF 上断言失败,否则我应该如何处理它?我会循环遍历 fd 集以找到“坏”文件描述符吗?

最佳答案

您的代码中有错误。修理它。在某个地方,您正在关闭一个套接字,而没有将其从选择器使用的 FD 集中删除。或者您刚刚编写了一个不是 FD 的 FD,并在 FD 集中使用它。

与此处的其他陈述相反,网络问题不会导致此错误。网络中断不会关闭套接字,这是它们变为无效的唯一方式。只有关闭它们才能做到这一点。如果您继续写入,连接不工作的套接字最终将导致 ECONNRESET。对端已断开连接的套接字将变得可读,并且其上的 recv() 将返回零。

关于c - 我应该在 select() EBADF 上断言失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015859/

相关文章:

c - 如何在 Keil uVision 中创建延迟功能?

c - 在 C 中使用套接字

java.net.SocketException : Malformed reply from SOCKS server, 使用 apache FTPClient

tcp - 如何通过 TCP 端口托管 WCF?

c - C中#include的尴尬问题

c - 在 OS X 上获取 CPU 时间

c - 使用管道写入和读取 Int 数组

C套接字发送UDP并处理来自路由器的ICMP回复

C# 使用 tcp 和 udp 协议(protocol)

阻塞模式下的 Linux TCP 套接字