可读取的套接字数据
Posted
技术标签:
【中文标题】可读取的套接字数据【英文标题】:Socket available data for read 【发布时间】:2009-11-26 22:01:04 【问题描述】:我需要快速方法来检查套接字是否有可供读取的数据。 我使用 select(),但速度不快。 是否存在更快的方法?
【问题讨论】:
它有什么不“快”的?调用 select() 需要多长时间,因此每秒可以执行的选择数。还是问题更多的是您正在进行多少总数据处理。定义你对“快”的含义/期望 我需要在 1/10 秒内检查大约 1000 个套接字,可能会更快。我用 1000 个套接字测试了 select()。每个套接字每 10 秒发送 4 个字节。 1 秒处理了 1000 个套接字。 【参考方案1】:由于需要重建 fd_set 以及它给出结果的方式,因此对于大型套接字集,select() 往往会降级。
Linux 上的 epoll() API 可能是我最喜欢的处理多个套接字的方法。您可以快速浏览一下,但它在 Windows 上不可用。
我相信在 Windows 上有这么多套接字的情况下,解决 select() 限制的唯一方法是使用 IO 完成端口。
【讨论】:
重建 fd_set?您的意思是 select() 本身会生成另一个 fd_set 并准备好读取套接字? select() 将修改传递给它的任何 fd_set。因此,在您下次调用时,您必须重新创建一个 fd_set 以传递给 select() - 通过您的套接字或复制另一个 fd_set,这两个操作都是 O(n) 操作。然而,像 epoll() 这样的 API 不需要传递一组 FD——它们会记住它们,并且你会通知 API FD 集中的变化。【参考方案2】:您需要在 Windows 上使用完成端口。网上有很多关于如何使用它们的文章。
【讨论】:
以上是关于可读取的套接字数据的主要内容,如果未能解决你的问题,请参考以下文章