以下为《boost-asio-cpp-network-programming-chinese》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
目? 开始 1.1 第一章 Boost.Asio入门 1.2 第二章 Boost.Asio基本原理 1.3 第三章 回显服务端/客户端 1.4 第四章 客户端和服务端 1.5 第五章 同步VS异步 1.6 第六章 Boost.Asio-其他特性 1.7 第七章 Boost.Asio-进阶 1.8 结束 1.9 1 开始 # 实战出精华 在具体的 C++ 网络编程中提升逼格 John Torjo Boost.Asio C++ 网络编程 Copyright © 2013 Packt Publishing 关于作者 做为一个权威的 C++ 专家,除了偶尔写写 C# 和 Java,John Torjo 把他超过 15 年编程生涯中的大部分时间都贡献给了 C++。 他很喜欢在 C++ Users Journal 和其它杂志上写一些编程相关的文章。 闲暇的时候,他也喜欢玩扑克、开快车。他有很多自由职业,其中有一个甚至把他 玩扑克和编程的爱好结合在一起。如果你想联系他,可以发邮件到 john.code@torjo.com。 我要感谢我的朋友 Alexandru Chis、Aurelian Hale、Bela Tibor Bartha、Cristian Fatu、Horia Uifaleanu、Nicolae Ghimbovschi 以及 Ovidiu Deac。感谢他们对本书 的反馈和意见。同时我也要感谢 Packt 公司对我频繁错过截稿日期行为的包容。然 后最需要感谢的是 Chris Kohlhoff,Boost.Asio 的作者,因为他,才有了 Boost.Asio 如此伟大的库。 把这本书送给我最好的朋友 Darius。 关于评审员 Béla Tibor Bartha 2 开始 一个使用多种技术和语言做开发的专业软件工程师。尽管在过去的 4 年里,他做的 是 iOS 和 OSX 应用开发,但是 C++ 陪伴他度过了早期个人游戏项目开发的激情岁 月。 我要感谢John,因为他我才能做这本书的评审 Nicolae Ghimbovschi 一个参加各类 C++ 项目超过 5 年的天才个人开发者。他主要参与一些企业通信工 程的项目。作为一个狂热的 Linux 爱好者,他喜欢利用不同的操作系统、脚本工具 和编程语言进行测试和实验。除了编程,他还喜欢骑自行车、瑜伽和冥想。 我要感谢 John 让我来评审这本书 关于译者 非主流程序猿 mmoaay,技术很烂,喜欢平面设计、鼠绘、交友、运动和翻译,但 是确作为一只程序猿混迹在IT行业。热爱开源,技术烂就只好做做设计和翻译的工 作。 微博:http://weibo.com/smmoaay 关于avplayer http://avplayer.org 中国第一技术社区。 目录 3 开始 前言 第一章:Boost.Asio 入门 什么是 Boost.Asio? 历史 依赖 编译 Boost.Asio 重要的宏 同步 VS 异步 异常 VS 错误代码 Boost.Asio 中的多线程 不仅仅是网络请求 计时器 io_service 类 总结 第二章:Boost.Asio 基本原理 4 开始 网络 API Boost.Asio 命名空间 IP 地址 端点 Sockets 同步错误代码 Socket 成员函数 其他注意事项 read/write/connect 自由函数 connect 函数 read/write 函数 异步编程 为什么要异步? 异步 run(),run_one(),poll(),poll_one() 持续运行 run_one(),poll(),poll_one() 函数 异步工作 异步 post() VS dispatch() VS wrap() 保持运行 总结 第三章:回显服务端/客户端 TCP 回显服务端/客户端 TCP 同步客户端 TCP 同步服务端 TCP 异步客户端 TCP 同步服务端 代码 UDP回显服务端/客户端 UDP 同步回显客户端 UDP 同步回显服务端 总结 第四章:客户端和服务端 5 开始 同步客户端/服务端 同步客户端 同步服务端 异步客户端/服务端 异步客户端 异步服务端 总结 第五章:同步 VS 异步 同步异步混合编程 客户端和服务端之间消息的互相传递 客户端软件中的同步 I/O 服务端软件中的同步 I/O 同步服务端中的线程 客户端软件中的异步 I/O 服务端软件中的异步 I/O 异步服务端中的线程 异步操作 代理实现 总结 第六章:Boost.Asio - 其他特性 std streams 和 std buffer I/O Boost.Asio 和 STL 流 streambuf 类 处理 streambuf 对象的自由函数 协程 总结 第七章:Boost.Asio - 进阶 6 开始 Asio VS Boost.Asio 调试 处理程序跟踪信息 例子 处理程序跟踪文件 SSL Boost.Asio 的 Windows 特性 流处理 随机存储处理 对象处理 Boost.Asio 的 POSIX 特性 本地 sockects 连接本地 sockets POSIX 文件描述符 Fork 总结 索引 前言 网络编程由来已久,并且极富挑战性。Boost.Asio 对网络编程做了一个极好的抽 象,从而保证只需要少量的代码就可以实现一个优雅的客户端/服务端软件。在实现 的过程中,它能让你体会到极大的乐趣。而且更为有益的是:Boost.Asio 还包含了 一些非网络的特性,用 Boost.Asio 写出来的代码紧凑、易读,而且如果按照我在书 中所说的来做,你的代码将无懈可击。 这本书讲了什么? 第一章:Boost.Asio入门将告诉你什么是 Boost.Asio?怎么编译它?然后还有一些 例子。通过本章你会发现 Boost.Asio 不仅仅是一个网络库。另外你还会接触到 Boost.Asio 中最核心的类 io_service。 7 开始 第二章:Boost.Asio基本原理包含了你必须了解的内容:什么时候用Boost.Asio? 我们将深入了解异步编程——一种比同步更需要技巧,且更有乐趣的编程方式。这 一章也是在开发你自己的网络应用时做为参考的一章。 第三章:回显服务端/客户端将告诉你如何实现一个小的客户端/服务端应用;也许 这会是你写过的最简单的客户端/服务端应用。回显应用就是把客户端发过来的消息 发送回去然后关闭客户端连接的服务。我们会先实现一个同步的版本,然后再实现 一个异步的版本,这样就可以非常容易地看到它们之间的不同。 第四章:客户端和服务端会深入讨论如何用 Boost.Asio 创建一个简单的客户端/服 务端应用。我们将讨论如何避免内存泄漏和死锁等问题。为了让你能更方便地对它 们进行扩展以满足自己的需求,所有的程序都只实现一个简单的框架。 第五章:同步VS异步会带你了解在同步和异步方式之间做选择时需要考虑的事情。 首要的事情就是不要混淆它们。在这一章,我们会发现:实现、测试和调试每个类 型应用都是非常容易的。 第六章:Boost.Asio 的其他特性将带你了解 Boost.Asio 一些不为人知的特性。你会 发现,虽然 std streams 和 streambufs 有一点点难用,但是却表现出了它们得天独 厚的优势。最后,是姗姗来迟的 Boost.Asio 协程,它可以让你用一种更容易读懂的 方式来写异步代码。(就好像写同步代码一样) 第七章:Boost.Asio 进阶包含了对 Boost.Asio 进阶问题的处理。虽然不需要在日常 编程中深入研究它们,但是了解它们对你有益无害(Boost.Asio 高级调试,SSL, Windows 特性,POSIX 特性等)。 读这本书你需要准备什么? 如果需要编译 Boost.Asio 以及运行本书中的例子,你需要一个现代编译器。例如, Visual Studio 2008 及其以上版本或者 g++ 4.4 及其以上版本 这本书是为谁准备的? 这本书对于那些需要做网络编程却不想深入研究复杂原始网络 API 的开发者来说是 一个福音。所有你需要的只是 Boost.Asio 提供的一套 API。作为著名 Boost C++ 库的一部分,你只需要额外添加几个 #include 文件即可转换到 Boost.Asio。 8 开始 在读这本书之前,你需要熟悉 Boost 核心库的一些知识,例如 Boost 智能指针、 boost::noncopyable、Boost Functors、Boost Bind、shared_ from_this/enabled_shared_from_this 和 Boost 线程(线程和互斥量)。同时还需 要了解 Boost 的 Date/Time。另外读者还需要知道阻塞的概念以及“非阻塞”操作。 约定 本书使用不同样式的文字来区分不同种类的信息。这里给出这些样式的例子以及它 们的解释。 文本中的代码会这样显示:“通常一个io_service的例子就足够了”。 一段代码是下面这个样子的: read(stream, buffer [, extra options]) async_read(stream, buffer [, extra options], handler) write(stream, buffer [, extra options]) async_write(stream, buffer [, extra options], handler) 专业词汇和重要的单词用黑体显示 [!警告或者重要的注释在这样的一个框里面] [?技巧在这样的一个框里面] 读者反馈 我们欢迎来自读者的反馈。告诉我们你对这本书的看法——你喜欢哪部分,不喜欢 哪部分。读者的反馈对我们非常重要,它能让我们写出对读者帮助更大的书。 你只需要发送一封邮件到 feedback@packtpub.com 即可进行反馈,注意在邮件的 主题中注明书名。 如果你有一个擅长的专题,想撰写一本书或者为某本书做贡献。请阅读我们在 doc.001pp.com/authors 上的作者指引。 9 开始 用户支持 现在你已经是 Packt 书籍的拥有者,我们将告诉你一些注意事项,让你购买本书得 到的收益最大化。 下载示例代码 你可以在 http://doc.001pp.com 登录你的帐号,然后下载你所购买书籍的全部 示例代码。同时,你也可以通过访问 http://doc.001pp.com/support 进行注册, 这些示例代码文件将直接发送到你的邮箱。 纠错 尽管我们已经尽最大的努力去保证书中内容的准确性,但是错误还是存在的。如果 你在我们的书籍中发现了错误——也许是文字,也许是代码——如果你能将它们报 告给我们,我们将不胜感激。这样的话,你不仅能帮助其他读者,同时也能帮助我 们改进这本书的下一个版本。如果你发现任何需要纠正的地方,访问 http://doc.001pp.com/submit-errata,选择你的书籍,点击 errata submission form 链接,然后输入详细的纠错信息并将错误报告给我们。一旦审核通过,这个 纠错就会被上传到我们的网站,或者添加到那本书的纠错列表中。所有已发现的纠 错都可以访问 http://doc.001pp.com/support,然后通过选择书名的方式来查 看。 答疑 如果有任何关于本书的问题,你可以通过 questions@packtpub.com 联系我们。我 们将尽我们最大的努力进行解答。 10 第一章 Boost.Asio入门 Boost.Asio入门 首先,让我们先来了解一下什么是Boost.Asio?怎么编译它?了解的过程中我们会 给出一些例子。然后在发现Boost.Asio不仅仅是一个网络库的同时你也会接触到 Boost.Asio中最核心的类——io_service。 什么是Boost.Asio 简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编 程的C++库。 计算机网络的设计方式有很多种,但是Boost.Asio的的方式远远优于其它的设计方 式。它在2005年就被包含进Boost,然后被大量Boost的用户测试并在很多项目中使 用,比如Remobo(http://doc.001pp.com),可以让你创建你自己的即时私有网络 (IPN)的应用,libtorrent(http://doc.001pp.com/products/libtorrent))一个实现了 比特流客户端的库,PokerTH (http://doc.001pp.com)一个支持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) 从前面的代码片段可以看出,这些函数支持传入包含任意内容(不仅仅是一个 socket,我们可以对它进行读写)的流实例。 作为一个跨平台的库,Boost.Asio可以在大多数操作系统上使用。能同时支持数千 个并发的连接。其网络部分的灵感来源于伯克利软件分发(BSD)socket,它提供了 一套可以支持传输控制协议(TCP)socket、用户数据报协议(UDP)socket和Internet 控制消息协议(IMCP)socket的API,而且如果有需要,你可以对其进行扩展以支持 你自己的协议。 历史 11 第一章 Boost.Asio入门 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以上等平台上使 用。(更多细节请咨询doc.001pp.com) 依赖 Boost.Asio依赖于如下的库: Boost.System:这个库为Boost库提供操作系统支持 (http://doc.001pp.com/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: 12 第一章 Boost.Asio入门 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的过程 中使用了线程支持,Boost.Asio中的线程支持都会失效。 同步VS异步 首先,异步编程和同步编程是非常不同的。在同步编程中,所有的操作都是顺序执 行的,比如从socket中读取(请求),然后写入(回应)到socket中。每一个操作 都是阻塞的。因为操作是阻塞的,所以为了不影响主程序,当在socket上读写时, 通常会创建一个或多个线程来处理socket的输入/输出。因此,同步的服务端/客户 端通常是多线程的。 相反的,异步编程是事件驱动的。虽然启动了一个操作,但是你不知道它何时会结 束;它只是提供一个回调给你,当操作结束时,它会调用这个API,并返回操作结 果。对于有着丰富经验的QT(诺基亚用来创建跨平台图形用户界面应用程序的库) 程序员来说,这就是他们的第二天性。因此,在异步编程中,你只需要一个线程。 因为中途做改变会非常困难而且容易出错,所以你在项目初期(最好是一开始)就 得决定用同步还是异步的方式实现网络通信。不仅API有极大的不同,你程序的语 意也会完全改变(异步网络通信通常比同步网络通信更加难以测试和调试)。你需 要考虑是采用阻塞调用和多线程的方式(同步,通常比较简单),或者是更少的线 程和事件驱动(异步,通常更复杂)。 下面是一个基础的同步客户端例子: 13 第一章 Boost.Asio入门 using boost::asio; io_service service; ip::tcp::endpoint ep( ip::address::from_string("127.0.0.1"), 200 1); ip::tcp::socket sock(service); sock.connect(ep); 首先,你的程序至少需要一个io_service实例。Boost.Asio使用io_service同操作系 统的输入/输出服务进行交互。通常一个io_ 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 lse { // 父进程 service.notify_fork(io_service::fork_parent); ... } 这意味着会在不同的线程使用即将被调用的service。尽管Boost.Asio允许这样,我 还是强烈推荐你使用多线程,因为使用boost::thread简直就是小菜一碟。 总结 为简单明了的代码而奋斗。学习和使用协程会最小化你需要做的调试工作,但仅仅 是在代码中有潜在bug的情况下,Boost.Asio才会伸出援手,这一点在关于调试的 章节中就已经讲过。 如果你需要使用SSL,Boost.Asio是支持基本的SSL编码的 最终,如果已经知道应用是针对专门的操作系统的,你可以享用Boost.Asio为那个 特定的操作系统准备的特性。 145 结束 就目前来说,网络编程是非常重要的。作为21世纪所有C++程序员的必学内容,我 们对Boost.Asio的理论进行了深入理解并付诸实践。因为本书的内容都可以很简单 的进行阅读、测试、理解和扩展,所以你可以把它当作一个参考以及便携的 Boost.Asio样例库。 最后,希望你能以读本书为乐,以编程为乐。 146 [文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《boost-asio-cpp-network-programming-chinese》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。