boost::asio扩展TCP套接字

3
我正在尝试制作一个ASIO扩展,类似于boost socket,在Windows和Linux上都有实现。这些扩展将用于使用EIBD与KNX网络进行交互,适用于Linux。问题是如何监视多个文件描述符。如果使用select(),如何解决FD_SETSIZE的限制?
boost在socket实现中是如何处理这个问题的?据我所知,在Windows上使用IO完成端口。

1
请查看epoll - Some programmer dude
这需要深入理解 asio 的内部机制,我认为没有现成的解决方案。 - Galimov Albert
也许我漏掉了什么,这不是 null_buffers 的目的吗? - Sam Miller
1个回答

3
我的问题的简短回答是使用 epoll。根据wikipedia,epoll是Linux的可扩展I/O事件通知机制,最初在Linux内核2.5.44中引入。
select(2)可以同时监视多达FD_SETSIZE个描述符,通常是由libc编译时确定的小数量。相反,epoll没有这样的固定限制,并且不执行任何线性扫描。因此,它能够更好地执行并处理更多的事件。
有关如何使用epoll的教程,请访问banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/
至于Boost,在许多平台上,Boost.Asio以Reactor的形式实现Proactor设计模式,例如select(kernel 2.4),epoll(kernel 2.6)或kqueue(Mac OS)。
在Windows NT、2000和XP上,Boost.Asio利用重叠I/O来提供Proactor设计模式的高效实现。
更多关于Boost的内容:

www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview/core/async.html

www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/design/implementation.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接