Hello Asio!

大部分的而程序都会与外部世界进行交互,无论是通过文件、网络、串行电缆,还是通过控制台。有时,比如在网络编程时,独立的I/O操作发起后,可能会需要很久才能完成。这给应用程序的开发带来了特定的挑战性。

Boost.Asio 是一个跨平台的现代C++库,它提供给开发者一个通用的异步模型,用于处理网络传输或低层的I/O操作。

简介

Boost.Asio提供了许多工具来帮助完成这些耗时操作,而且避免使用基于线程和显示锁的并发模型,简化了程序的设计和编写。Boost.Asio库的适用对象主要是使用C++进行系统编程的程序员,系统编程这类工作对操作系统功能(如网络功能)的使用非常频繁。

具体来说,Boost.Asio的希望达到的目标如下:

  • 移植性。支持现有的大部分操作系统,提供统一的接口。
  • 伸缩性。支持海量并发连接的网络应用开发,利用不同操作系统的不同机制来实现最高的性能。
  • 高效。支持离散聚合I/O操作,允许程序最小化数据拷贝。
  • 适配现有的API,如BSD套接字。BSD套接字API在实际工作中被广泛使用,并且有许多介绍文档。其他的程序语言也会使用相似的接口来实现网络API。
  • 便于使用。与其提供一整套框架,程序库为新的用户提供了一套非常容易入门的工具集。尽可能减少使用者在前期投入的时间,在学习了一些简单的规则和指导后,使用者只需要理解他们需要的特定函数便可以实现特定的工作。
  • 支持更高层的抽象。支持更高抽象层次的开发。比如实现一个HTTP协议。

尽管Boost.Asio被设计为处理网络编程,但是它异步操作的理念也可以适用于如端口,文件描述子等等其他操作系统资源。

Hello World!

让我们从一个简单的定时器开始。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Wait a timer asynchronously.
// Use a lambda as the wait handler.
#include <iostream>

#define BOOST_ASIO_NO_DEPRECATED
#include "boost/asio.hpp"
#include "boost/core/ignore_unused.hpp"
#include "boost/date_time/posix_time/posix_time.hpp"

int main() {
// Your program will have at least one io_context object, which represents your
// program's link to the operating system's I/O services.
boost::asio::io_context io_context;

// To perform I/O operations your program will need an I/O object such as a timer
boost::asio::deadline_timer timer(io_context, boost::posix_time::seconds(3));

// a completion handler is a function or function object with the signature:
// void handler(const boost::system::error_code& ec);
timer.async_wait([](boost::system::error_code ec) {
boost::ignore_unused(ec);
std::cout << "Hello, World!" << std::endl;
});

// A call to io_context::run() blocks while there
// are unfinished asynchronous operations
io_context.run();

// While inside the call to io_context::run(), the io_context dequeues
// the result of the operation, translates it into an error_code,
// and then passes it to your completion handler.

return 0;
}