2012-06-29 43 views
1

我得到了使用一些旧代码:非阻塞插座,选择超时,(2)和(2)。 现在它偶尔因选择/ 1024 fd限制而失败。所以我需要更换选择。如何检查非阻塞套接字超时无选择

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

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

+1

要从ciphor回答,请查看http://linux.die.net/man/7/epoll –

+0

值得一提的是,您的操作系统也有一个文件描述符限制,它可能设置为1024.我也推荐类似'libev'的东西。 –

+0

@JoachimPileborg查看我对安迪罗斯的评论 – xgwang

回答

4

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

+0

它似乎我只是忘了有一个民意调查...“不要改变整体代码结构”正是我想要的。有时你只需要尽快修复一些东西...... – xgwang

2

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

+0

原来的** select **实际上是在读取/写入期间接收到** EAGAIN **或** EWOULDBLOCK **时检查非阻塞套接字状态。我在这里没有经验,我认为使用epoll来检查循环读/写时的EAGAIN **是有点浪费,因为它可能只监视一个套接字。 – xgwang

3

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

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

+0

好吧,我只是维护这些代码,并没有太多的选择。希望我有机会在未来介绍这些最佳作品。 – xgwang