boost::asio 扩展 TCP 套接字

Posted

技术标签:

【中文标题】boost::asio 扩展 TCP 套接字【英文标题】:boost::asio extension TCP socket 【发布时间】:2012-11-10 17:44:17 【问题描述】:

我正在尝试制作一个类似于 boost socket 的 asio 扩展,并在 windows 和 linux 上实现。这些扩展将用于使用 EIBD 与 Linux 的 KNX 网络进行交互。问题是,如何监控多个文件描述符。如果使用 select() 如何绕过 FD_SETSIZE 限制?

boost 如何在套接字实现中处理这个问题?据我所知,Windows 上使用的是 IO 完成端口。

【问题讨论】:

看epoll。 这需要对asio内部有深入的了解,我认为没有现成的解决方案 可能我遗漏了什么,这不就是null_buffers的目的吗? 【参考方案1】:

我的问题的简短回答是使用epoll。据wikipedia介绍,epoll是Linux下可扩展的I/O事件通知机制,最早引入Linux kernel 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

【讨论】:

以上是关于boost::asio 扩展 TCP 套接字的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Boost.ASIO 中分配已连接的本机套接字类型 (TCP)

如何接受boost :: asio :: ssl :: stream 作为boost :: asio :: ip :: tcp :: socket类型的参数

使用 Boost Asio 在 TCP 套接字上执行异步写入操作

使用 boost::asio::ip::tcp::socket 作为 shared_ptr

如何将 boost::asio::tcp::io_stream 附加到我的 io_service?

Boost:asio 套接字读/写所花费的时间