Boost.Asio入门
什么是Boost.Asio
简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。
计算机网络的设计方式有很多种,但是Boost.Asio的的方式远远优于它们。它在2005年就被包含进Boost,然后被广大Bosot的用户测试并在很多项目中使用,比如Remobo(http://www.remobo.com),可以让你创建你自己的即时私有网络(IPN),libtorrent(http://www.rasterbar.com/products/libtorrent)一个实现了比特流客户端的库,PokerTH (http://www.pokerth.net)一个支持LAN和互联网游戏的纸牌游戏。
Boost.Asio在网络通信、COM串行端口和文件上成功地抽象了输入输出的概念
。你可以基于这些进行同步或者异步的输入输出编程。
read(stream, buffer [, extra options])
async_read(stream, buffer [, extra options], handler)
write(stream, buffer [, extra options])
async_write(stream, buffer [, extra options], handler)
async_read(stream, buffer [, extra options], handler)
write(stream, buffer [, extra options])
async_write(stream, buffer [, extra options], handler)
[?…]
从前面的代码片段可以看出,这些函数支持一个任意内容(不仅仅是一个socket,我们可以对它进行读写)的流实例。
作为一个跨平台的库,Boost.Asio可以在大多数操作系统上使用。能同时支持数千个并发的连接。其
网络部分的灵感来源于伯克利软件分发(BSD)套接字,它提供了一个可以支持传输控制协议(TCP)套接字、用户数据报协议(UDP)套接字和Internet控制消息协议(IMCP)套接字的API,而且如果有需要,你可以对其进行扩展以支持你自己的协议。
历史
Boost.Asio在2003被开发出来,然后在2005年的12月的Boost 1.35版本中引入。原作者是Christopher M. Kohlhoff,你可以通过chris@kohlhoff.com联系他。
这个库在如下的平台和编译器上测试通过:
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及以上
它或许能在诸如AIX 5.3,HP-UX 11i v3,QNX Neutrino 6.3,Solaris下使用Sun Studio 11以上,True64 v5.1,Windows下使用Borland C++ 5.9.2以上等平台上使用。(更多细节请咨询www.boost.org)
依赖
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支持。
编译Boost.Asio
Boost.Asio是一个仅有头文件的库。然而,根据你的编译器和你程序的大小,你可以选择用源文件的方式来编译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
这个库有大量的例子,你可以连同这本书中的例子一块看看。
重要的宏
如果有需要设置了BOOST_ASIO_DISABLE_THREADS;他会让Boost.Asio中的线程支持失效,不管在编译Boost的过程中是否使用了线程支持。