现在的位置: 首页 > 综合 > 正文

BOOST asio库的使用备忘

2013年08月24日 ⁄ 综合 ⁄ 共 1117字 ⁄ 字号 评论关闭

    最近在测试使用boostasio的网络库,目前公司并没有用于商用,但既然是测试使用,所以对上层的接口和应用先尝试了一下,感觉对于TCP服务器中整个网络模型的塔建,使用起来都算比较方便,毕竟asio本身已经提供了一个成型的框架以及方便的接口。创建一个TCP服务器,只需要创建组件ACCEPTOR用于监听,然后自己实现维护连接的session,ACCEPT成功后创建session,如果是异步连接的话让session调用async_read_some 并注册读取数据成功的回调函数例如handle_read,那么该session接收到数据后则自动回调handle_read函数。具体的细节都放在测试的代码里面了,网上也有比较多的例子,并不算复杂。同理,想要向对端发送数据则直接调用async_write函数,以及注册发送成功的回调函数。 这就是最基础的用ASIO对TCP通讯网络模型的搭建。

    这边还要提到,一个比较重要的概念,就是IoService类,这是整个boost asio库的基础,前面提到的几乎都与其有关,包括ACCEPTOR组件的创建,以及session类的创建都想要用IoService做为基础。IoService在boost库中是一个跨平台的实现,观看boost的源码,可以看到 Config.hpp里面对应于不同的应用平台,会有不同的宏定义,目前如果是win下并且版本大于0x0400则使用win IOCP的网络模型,如果是linux平台,并且有EPOLL的版本,则使用EPOLL模型。写到这里,可能会有比较多人有疑问,既然asio库无非就是在window下对iocp的封装,在linux下对epoll的封装,如果不想要写跨平台的系统,那么其实自己实现一套独立平台的应用也就完事。其实这也不无道理,例如在window平台下,目前我们用IOCP搭建的网络应用则已经比较成熟了。但为何还要研究boost asio库其实说白了就是被其比较好的封装特性所吸引,还有在你对相应平台api不是特别熟悉的情况下,可以比较快的搭建出一个目前来看还算比较稳定的服务应用。毕竟boost库里面的东西稳定性还是比较值得信任的。不过这里还有一个建议就是,如果要在大规模商用boost asio库的应用,还是必须对boost asio的底层实现做一番了解,以及进行大规模的压力测试

   从目前对底层实现的初步了解来看,在window平台下,目前应该可以根据cpu的核数使用多线程来对数据进行并发通讯,要注意的一点是必须使用boost的线程同步方法来保证线程安全,具体的实现在boost下页比较简单,使用strand函数对使用数据的收发函数进行包装就可以。

抱歉!评论已关闭.