多语言展示
当前在线:1657今日阅读:176今日分享:34

boost.aiso 使用教程

Boost.Asio是一个跨平台的C++库,用于网络和底层I/O编程,可以在I/O对象(如socket)上执行同步和异步操作。
工具/原料

你的程序中需要至少定义一个io_service对象:boost::asio::io_service io_service。io_service表示程序到操作系统I/O服务的“连接”。   为执行I/O操作,还需要一个I/O对象(通常需要使用io_service构造),如一个TCP套接字:boost::asio::ip::tcp::socket socket(io_service)

方法/步骤
1

同步的连接过程中,发生以下事件序列(对应下面的左图):  (1)程序通过I/O对象启动连接操作:socket.connect(server_endpoint);  (2)I/O对象将请求转发给io_service;  (3)io_service请求操作系统去执行连接操作;  (4)操作系统将操作结果返回给io_service;  (5)io_service将操作的(错误)结果转换成boost::system::error_code对象,并回传给I/O对象;  (6)如果操作失败,I/O对象抛出boost::system::system_error异常。                如果是使用以下方式,则只设置错误码,不会抛出异常:

2

异步的连接过程中,发生以下事件序列(对应下面的中图和右图):  (1)程序通过I/O对象启动连接操作:socket.async_connect(server_endpoint, your_completion_handler);  your_completion_handler是一个函数(对象),原型:void your_completion_handler(const boost::system::error_code& ec);  (2)I/O对象将请求转发给io_service;  (3)io_service发信号给操作系统,告知它去开始一个异步的连接操作;  一段时间过去... ...注意,在同步的情形下,程序会一直等待连接操作完成,而异步则是先立即返回。  (4)连接操作完成时,操作系统把结果放在队列中;  (5)程序必须调用io_service::run()(或类似函数)以取得操作结果。一般在你刚启动第一个异步操作时就要调用run();  io_service对象未停止(stopped()返回false)且还有未完成的操作时,run()会一直阻塞,否则直接返回。  我的理解(io_service对象未停止时):如果当前有未完成的异步操作且队列为空,则需要等待,因此run()将阻塞(在Linux下借助pstack可知是阻塞于epoll_wait()或pthread_cond_wait()等)。操作系统完成某个异步操作后,把结果放到队列并通知应用程序。run()被“唤醒”,从队列中取出结果并调用相应的回调函数;如果当前没有未完成的异步操作且队列为空,表示所有异步操作已经完成,则run()将直接返回;当然,如果当前队列非空,则run()直接取出结果并调用回调函数。  asio保证了回调函数只会被run()所在线程调用。因此,若没有run(),回调函数永远不会被调用。  (6)在run()中io_service将操作结果取出队列并翻译成error_code,然后传递给your_completion_handler。

推荐信息