当前位置: 首页 > 工具软件 > Asio > 使用案例 >

Boost.Asio简介

荀增
2023-12-01

1,什么是Boost.Asio

Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库,在网络通信、COM串行端口和文件上成功地抽象了输入输出的概念,使我们可以基于这些进行同步或者异步的输入输出编程,作为一个跨平台的库,Boost.Asio可以在大多数操作系统上使用,能同时支持数千个并发的连接,并且提供了一套可以支持传输控制协议(TCP)socket、用户数据报协议(UDP)socket和Internet控制消息协议(IMCP)socket的API,且我们还可以对其进行扩展以支持我们自己的协议。

 

2,一些使用boost.asio来实现计算机网络设计的开源东东

Remobo(http://www.remobo.com),可以让你创建你自己的即时私有网络(IPN)

libtorrent(http://www.rasterbar.com/products/libtorrent))一个实现了比特流客户端的库

PokerTH (http://www.pokerth.net)一个支持LAN和互联网对战的纸牌游戏

 

3,boost.asio测试通过的平台和编译器(更多细节可以查询www.boost.org

32-bit和64-bit Windows,使用Visual C++ 7.1及以上
Windows下使用MinGW
Windows下使用Cygwin(确保已经定义 __USE_232_SOCKETS)
基于2.4和2.6内核的Linux,使用g++ 3.3及以上
Solaris下使用g++ 3.3及以上
MAC OS X 10.4以上下使用g++ 3.3及以上

 

4,boost.asio依赖的库

Boost.System:这个库为Boost库提供操作系统支持(http://www.boost.org/doc/libs/1_51_0/doc/html/boost_system/index.html)
Boost.Regex:使用这个库(可选的)以便你重载read_until()或者async_read_until()时使用boost::regex参数。
Boost.DateTime:使用这个库(可选的)以便你使用Boost.Asio中的计时器
OpenSSL:使用这个库(可选的)以便你使用Boost.Asio提供的SSL支持

 

5,一些其他相关东东

5.1,如何减少boost.asio的编译时间

在你的一个源文件中,添加#include "boost/asio/impl/src.hpp"(如果你在使用SSL,添加#include "boost/asio/ssl/impl/src.hpp") 在你所有的源文件中,

添加#define BOOST_ASIO_SEPARATE_COMPILATION
注意Boost.Asio依赖于Boost.System,必要的时候还依赖于Boost.Regex,所以你需要用如下的指令先编译Boost:bjam –with-system –with-regex stage
如果你还想同时编译tests,你需要使用如下的指令:bjam –with-system –with-thread –with-date_time –with-regex –with-serialization stage

5.2,如何让Boost.Asio中的线程支持失效

如果设置了BOOST_ASIO_DISABLE_THREADS;Boost.Asio中的线程支持都会失效,不管在编译Boost
的过程中是否使用了线程支持

 

5.3,Boost.Asio中的线程

5.3.1, io_service:io_service是线程安全的,几个线程可以同时调用io_service::run()
5.3.2, socket:socket类不是线程安全的。所以,要避免在某个线程里读一个socket时,同时在另外一个线程里面对其进行写入操作
5.3.3, utility:就utility来说,因为它不是线程安全的,所以通常也不提倡在多个线程里面同时使用。里面的方法经常只是在很短的时间里面使用一下,然后就释放了。

 

5.4,Boost.Asio的一些其他I/O功能

5.4.1, Boost.Asio支持信号量,计时器

5.4.2, Boost.Asio可以连接到一个串行端口。在Windows上端口名称是COM7,在POSIX平台上是/dev/ttyS0

5.4.3, Boost.Asio可以连接到Windows的文件,对于POXIS文件描述符,比如管道,标准I/O和各种设备(但不包括普通文件)也可以用Boost.Asio连接

 

5.5,io_service::run()

5.5.1, io_service::run(),这个函数必须等待所有异步操作完成之后才能继续执行,事实上我们可以在多个线程中调用io_service::run(),这会阻塞所有调用io_service::run()的线程,只要当中任何一个线程调用了io_service::run(),所有的回调都会同时被调用,这也就意味着,当我们在一个线程中调用io_service::run()时,所有的回调都被调用

5.5.2, 一般我们是通过异步操作来给io_service::run()更多的工作以保证其一直运行,但偶尔我们可能想模拟一些工作给io_service::run(),可以通过如下代码实现

typedef boost::shared_ptr work_ptr;
work_ptr dummy_work(new io_service::work(service));
上面的代码会模拟一些工作给service.run(),保证其一直运行直到我们调用useservice.stop()或者 dummy_work.reset(0);// 销毁dummy_work.

 类似资料: