c++ - boost::asio 扩展 TCP 套接字

标签 c++ sockets boost boost-asio

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

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

最佳答案

我的问题的简短答案是使用 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

关于c++ - boost::asio 扩展 TCP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13510794/

相关文章:

c++ - 为什么这个数组分配会导致段错误?

C++ mincore返回 vector 每个字节为1

客户端 : recv transport endpoint not connected

python - 如何在c中实现Python socket.unwrap()?

ubuntu - 在/usr/lib : sudo ./boostrap.sh 命令未找到安装 boost 库

c++ - 为什么我的 constexpr 函数不能返回 lambda?

c++ - 水平撕裂 DirectX9

无法访问 ifreq 结构定义,__USE_MISC 宏未定义

c++ - 为带参数的函数转换 boost::array<float, 12> (const float (&arr)[12])

c++ - 使用带有 boost::bimap 的自定义分配器