Table of Contents
1. Introduction
2. 第一章
3. 第二章
实战出精华
用具体的C++网络编程例子来提升你的逼格
John Torjo
Boost.Asio C++ 网络编程
Copyright © 2013 Packt Publishing
关于作者
做为一个权威的C++专家,在John Torjo超过15年的编程生涯中,他把大部分的时间都贡献给了C++。偶
尔也会用C#和Java写程序。
他也很喜欢在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的作者,是他写出了一个如此
伟大的库。
把这本书献给我最好的朋友Darius。
关于评审员
Béla Tibor Bartha
一个用各种技术和语言进行工作的专业软件工程师。尽管在过去的4年里,他做的是iOS和OSX应用开发,
但是C++陪伴他度过了他早期个人游戏项目开发的激情岁月。
我要感谢John,因为他我才能做这本书的评审
Nicolae Ghimbovschi
一个参加各种各样的C++项目超过5年的天才个人开发者。他主要参与一些企业通信工程的项目。他是一个
狂热的Linux爱好者,他喜欢利用不同的操作系统、脚本工具、编程语言进行测试和实验。除了编程,他还
喜欢骑自行车、瑜伽和冥想。
我要感谢John让我来评审这本书
关于译者
非主流程序猿mmoaay,技术很烂,喜欢平面设计、鼠绘、交友、运动和翻译,但是确作为一只程序猿混
迹在IT行业。热爱开源,技术烂就只好做做设计和翻译的工作。
微博:http://weibo.com/smmoaay
关于avplayer
http://avplayer.org 中国第一技术社区。
目录
前言
第一章:Boost.Asio入门
什么是Boost.Asio?
历史
依赖
编译 Boost.Asio
重要的宏
同步VS异步
异常VS错误代码
Boost.Asio中的多线程
不仅仅是网络
计时器
io_service类
总结
第二章:Boost.Asio基本原理
网络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同步回显服务端
总结
第四章:客户端和服务端
同步客户端/服务端
同步客户端
同步服务端
异步客户端/服务端
异步客户端
异步服务端
总结
第五章:同步VS异步
同步异步混合编程
客户端和服务端之间消息的互相传递
客户端软件中的同步I/O
服务端软件中的同步I/O
同步服务端中的线程
客户端软件中的异步I/O
服务端软件中的异步I/O
异步服务端中的线程
异步操作
代理实现
总结
第六章:Boost.Asio-其他特性
std streams和std buffer I/O
Boost.Asio和STL流
streambuf类
处理streambuf对象的自由函数
协程
总结
第七章:Boost.Asio-进阶
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。
第二章: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提供的一个简单抽象。作为著名的Boost C++库的一部分,你只需要额外添加几个
#include文件即可转换到Boost.Asio。
在读这本书之前,你需要熟悉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即可进行一般的反馈,注意在邮件的主题中注明书名。
如果你有一个擅长的专题,想撰写一本书或者为某本书做贡献。请阅读我们在www.packtpub.com/authors
上的作者指引。
用户支持
现在你已经是Packt书籍的拥有者,我们将告诉你一些事项,让你购买本书得到的收益最大化。
下载示例代码
你可以在http://www.packtpub.com登录你的帐号,然后下载你所购买的书籍的全部示例代码。同时,你也
可以通过访问http://www.packtpub.com/support进行注册,然后这些示例代码文件将直接发送到你的邮箱。
纠错
尽管我们已经尽最大的努力去保证书中内容的准确性,但是错误始终是存在的。如果你在我们的书籍中发
现了错误——也许是文字,也许是代码——如果你能将它们报告给我们,我们将不胜感激。这样的话,你
不仅能让帮助其他读者避免一些疑惑,同时也能帮助我们改进这本书的下一个版本。如果你发现任何需要
纠正的地方,访问http://www.packtpub.com/submit-errata,选择你的书籍,点击errata submission form
链接,然后输入详细的纠错信息来将错误报告给我们。一经确定,你的提交就会通过并且纠错会上传到我
们的网站,或者添加到那本书的纠错信息区域的纠错列表中。所有存在的纠错都可以访问
http://www.packtpub.com/support,然后通过选择书名的方式来查看。
答疑
如果你有关于本书任何方面的问题,你可以通过questions@packtpub.com联系我们。我们将尽我们最大的
努力进行解答
Boost.Asio入门
首先,让我们先了解Boost.Asio是什么?怎么编译它?顺带着会有一些例子。你会发现Boost.Asio不仅仅是
一个网络库。同时你也会接触到Boost.Asio中最核心的类——io_service。
什么是Boost.Asio
简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。
计算机网络的设计方式有很多种,但是Boost.Asio的的方式远远优于它们。它在2005年就被包含进Boost,
然后被大量Boost的用户测试并在很多项目中使用,比如Remobo(http://www.remobo.com),可以让你创建
你自己的即时私有网络(IPN),libtorrent(http://www.rasterbar.com/products/libtorrent))一个实现了比特流客
户端的库,PokerTH (http://www.pokerth.net)一个支持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)