这一章对Boost.Asio的一些进阶话题进行了阐述。在日常编程中深入研究这些问题是不太可能的,但是知道这些肯定是有好处的: 如果调试失败,你需要看Boost.Asio能帮到你什么 如果你需要处理SSL,看Boost.Asio能帮你多少 如果你指定一个操作系统,看Boost.Asio为你准备了哪些额外的特性 Asio VS Boost.Asio Boost.Asio的作者也保持了Asio。你可以用Asio的方式来思考,因为它在两种情况中都有:Asio(非Boost的)和Boost.Asio。作者声明过更新都会先在非Boost中出现,然后过段时间后,再加入到Boost的发布中。 不同点被归纳到下面几条: Asio被定义在asio::的命名空间中,而Boost.Asio被定义在boost::asio::中 Asio的主头文件是asio.hpp,而Boost.Asio的头文件是boost/asio.hpp Asio也有一个启动线程的类(和boost::thread一样) Asio提供它自己的错误码类(asio::error_code代替boost::system::error_code,然后asio:system_error代替boost::systrem::system_error) 你可以在这里查阅更多Asio的信息:http://think_async.com 你需要自己决定你选择的版本,我选择Boost.Asio。下面是一些当你做选择时需要考虑的问题: Asio的新版本比Boost.Asio的新版本发布要早(因为Boost的版本更新比较少) Asio只有头文件(而Boost.Asio的部分依赖于其他Boost库,这些库可能需要编译) Asio和Boost.Asio都是非常成熟的,所以除非你非常需要一些Asio新发布的特性,Boost.Asio是非常保险的选择,而且你也可以同时拥有其他Boost库的资源 尽管我不推荐这样,你可以在一个应用中同时使用Asio和Boost.Asio。在允许的情况下这是很自然的,比如你使用Asio,然后一些第三方库是Boost.Asio,反之亦然。 调试...…
Boost.Asio-其他特性
这章我们讲了解一些Boost.Asio不那么为人所知的特性。标准的stream和streambuf对象有时候会更难用一些,但正如你所见,它们也有它们的益处。最后,你会看到姗姗来迟的Boost.Asio协程的入口,它可以让你的异步代码变得非常易读。这是非常惊人的一个特性。 标准stream和标准I/O buffer 读这一章节之前你需要对STL stream和STL streambuf对象有所了解。 Boost.Asio在处理I/O操作时支持两种类型的buffer: boost::asio::buffer():这种buffer关联着一个Boost.Asio的操作(我们使用的buffer被传递给一个Boost.Asio的操作) boost::asio::streambuf:这个buffer继承自std::streambuf,在网络编程中可以和STL stream一起使用 纵观全书,之前的例子中最常见的例子如下: size_t read_complete(boost::system::error_code, size_t bytes){ ... } char buff[1024]; read(sock,...…
同步 VS 异步
修改于
Boost.Asio的作者做了一个很惊艳的工作:它可以让你在同步和异步中自由选择,从而更好地适应你的应用。 在之前的章节中,我们已经学习了各种类型应用的框架,比如同步客户端,同步服务端,异步客户端,异步服务端。它们中的每一个都可以作为你应用的基础。如果要更加深入地学习各种类型应用的细节,请继续。 混合同步异步编程 Boost.Asio库允许你进行同步和异步的混合编程。我个人认为这是一个坏主意,但是Boost.Asio(就像C++一样)在你需要的时候允许你深入底层。 通常来说,当你写一个异步应用时,你会很容易掉入这个陷阱。比如在响应一个异步write操作时,你做了一个同步read操作: io_service service; ip::tcp::socket sock(service); ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 8001); void on_write(boost::system::error_code err, size_t bytes) { char...…
客户端和服务端
在这一章节,我们会深入学习怎样使用Boost.Asio建立非凡的客户端和服务端应用。你可以运行并测试它们,而且在理解之后,你可以把它们做为框架来构造自己的应用。 在接下来的例子中: 客户端使用一个用户名(无密码)登录到服务端 所有的连接由客户端建立,当客户端请求时服务端回应 所有的请求和回复都以换行符结尾(’\n’) 对于5秒钟没有ping操作的客户端,服务端会自动断开其连接 客户端可以发送如下请求: 获得所有已连接客户端的列表 客户端可以ping,当它ping时,服务端返回ping ok或者ping client_list_chaned(在接下来的例子中,客户端重新请求已连接的客户端列表) 为了更有趣一点,我们增加了一些难度: 每个客户端登录6个用户连接,比如Johon,James,Lucy,Tracy,Frank和Abby 每个客户端连接随机地ping服务端(随机7秒;这样的话,服务端会时不时关闭一个连接) 同步客户端/服务端 首先,我们会实现同步应用。你会发现它的代码很直接而且易读的。而且因为所有的网络调用都是阻塞的,所以它不需要独立的线程。 同步客户端 同步客户端会以你所期望的串行方式运行;连接到服务端,登录服务器,然后执行连接循环,比如休眠一下,发起一个请求,读取服务端返回,然后再休眠一会,然后一直循环下去…… 因为我们是同步的,所以我们让事情变得简单一点。首先,连接到服务器,然后再循环,如下: ip::tcp::endpoint...…
回显客户端/服务端
在这一章,我们将会实现一个小的客户端/服务端应用,这可能会是你写过的最简单的客户端/服务端应用。回显应用就是一个把客户端发过来的任何内容回显给其本身,然后关闭连接的的服务端。这个服务端可以处理任何数量的客户端。每个客户端连接之后发送一个消息,服务端接收到完成消息后把它发送回去。在那之后,服务端关闭连接。 因此,每个回显客户端连接到服务端,发送一个消息,然后读取服务端返回的结果,确保这是它发送给服务端的消息就结束和服务端的会话。 我们首先实现一个同步应用,然后实现一个异步应用,以便你可以很容易对比他们: 为了节省空间,下面的代码有一些被裁剪掉了。你可以在附加在这本书的代码中看到全部的代码。 TCP回显服务端/客户端 对于TCP而言,我们需要一个额外的保证;每一个消息以换行符结束(‘\n’)。编写一个同步回显服务端/客户端非常简单。 我们会展示编码内容,比如同步客户端,同步服务端,异步客户端和异步服务端。 TCP同步客户端 在大多数有价值的例子中,客户端通常比服务端编码要简单(因为服务端需要处理多个客户端请求)。 下面的代码展示了不符合这条规则的一个例外: size_t read_complete(char * buf, const error_code & err, size_t bytes)...…
Boost.Asio 基本原理
这一章涵盖了使用Boost.Asio时必须知道的一些事情。我们也将深入研究比同步编程更复杂、更有乐趣的异步编程。 网络API 这一部分包含了当使用Boost.Asio编写网络应用程序时必须知道的事情。 Boost.Asio命名空间 Boost.Asio的所有内容都包含在boost::asio命名空间或者其子命名空间内。 boost::asio:这是核心类和函数所在的地方。重要的类有io_service和streambuf。类似read, read_at, read_until方法,它们的异步方法,它们的写方法和异步写方法等自由函数也在这里。 boost::asio::ip:这是网络通信部分所在的地方。重要的类有address, endpoint, tcp, udp和icmp,重要的自由函数有connect和async_connect。要注意的是在boost::asio::ip::tcp::socket中间,socket只是boost::asio::ip::tcp类中间的一个typedef关键字。 boost::asio::error:这个命名空间包含了调用I/O例程时返回的错误码 boost::asio::ssl:包含了SSL处理类的命名空间 boost::asio::local:这个命名空间包含了POSIX特性的类 boost::asio::windows:这个命名空间包含了Windows特性的类 IP地址 对于IP地址的处理,Boost.Asio提供了ip::address , ip::address_v4和ip::address_v6类。...…