如何检查非阻塞套接字超时没有选择

时间:2012-06-29 03:06:19

标签: c linux sockets tcp

我使用了以下遗留代码:非阻塞套接字,选择进行超时,读取(2)和写入(2)。 现在它偶尔因选择/ 1024 fd限制而失败。所以我需要替换选择。

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

那么还有其他最佳做法来检查非阻止套接字的超时(没有选择)吗?或者我必须得到一些计时器/ nanosleep来解决这个问题?

3 个答案:

答案 0 :(得分:4)

poll()本质上是使用select()的替代品,但没有1024文件描述符限制。您将不得不稍微更改代码以创建struct pollfd结构的数组,而不是使用fd_set s,但代码的整体结构不应该更改。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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