我得到了使用一些旧代码:非阻塞插座,选择超时,读(2)和写(2)。 现在它偶尔因选择/ 1024 fd限制而失败。所以我需要更换选择。如何检查非阻塞套接字超时无选择
RCVTIMEO和SNDTIMEO似乎也可以检查超时但它们适用于阻塞模式,并且它对从非阻塞变为阻塞影响过大。
那么,有没有其他的检查超时非阻塞插座(无选择)的最佳实践?或者我必须得到一些计时器/纳秒睡眠来解决这个问题?
我得到了使用一些旧代码:非阻塞插座,选择超时,读(2)和写(2)。 现在它偶尔因选择/ 1024 fd限制而失败。所以我需要更换选择。如何检查非阻塞套接字超时无选择
RCVTIMEO和SNDTIMEO似乎也可以检查超时但它们适用于阻塞模式,并且它对从非阻塞变为阻塞影响过大。
那么,有没有其他的检查超时非阻塞插座(无选择)的最佳实践?或者我必须得到一些计时器/纳秒睡眠来解决这个问题?
poll()
本质上是使用select()
的直接替换,但没有1024个文件描述符限制。您将不得不稍微更改代码以创建struct pollfd
结构的数组,而不是使用fd_set
s,但代码的整体结构不应更改。
它似乎我只是忘了有一个民意调查...“不要改变整体代码结构”正是我想要的。有时你只需要尽快修复一些东西...... – xgwang
poll()系统调用将会超时并且没有固定的文件描述符限制。如果你真的有1000个开放的描述符,你可能会更好地使用epoll(),它使用起来更复杂,但具有更好的缩放特性。
原来的** select **实际上是在读取/写入期间接收到** EAGAIN **或** EWOULDBLOCK **时检查非阻塞套接字状态。我在这里没有经验,我认为使用epoll来检查循环读/写时的EAGAIN **是有点浪费,因为它可能只监视一个套接字。 – xgwang
要从ciphor回答,请查看http://linux.die.net/man/7/epoll –
值得一提的是,您的操作系统也有一个文件描述符限制,它可能设置为1024.我也推荐类似'libev'的东西。 –
@JoachimPileborg查看我对安迪罗斯的评论 – xgwang