1

我使用了一些遗留代码:非阻塞套接字,选择超时,读取(2)和写入(2)。现在它偶尔会由于 select/1024 fd 限制而失败。所以我需要更换选择。

似乎 RCVTIMEO 和 SNDTIMEO 也可以检查超时,但它们适用于阻塞模式,并且从非阻塞更改为阻塞影响太大。

那么还有其他最佳实践来检查非阻塞套接字(无选择)的超时吗?或者我必须得到一些计时器/纳米睡眠来解决这个问题?

4

3 回答 3

4

poll()本质上是 using 的直接替代品select(),但没有 1024 个文件描述符限制。您必须稍微更改代码以创建struct pollfd结构数组而不是使用fd_sets,但代码的整体结构不必更改。

于 2012-06-29T03:15:56.783 回答
3

epoll 是比 select 更好的解决方案,不限于 1024 个描述符。

事实上,你可以使用libeventlibev来处理低级异步套接字 I/O,它们是所谓的异步 I/O 的“最佳实践”。

于 2012-06-29T03:21:29.333 回答
2

poll() 系统调用将超时,并且没有固定的文件描述符限制。如果你真的有 1000 个开放描述符,你可能会更好地使用 epoll(),它使用起来更复杂,但具有更好的缩放特性。

于 2012-06-29T03:19:42.970 回答