
Boost.Asio C++网络编程
文章平均质量分 94
C/C++ 网络库 Boost Asio 使用详解
草上爬
专注技术,热爱分享
展开
-
Boost.Asio C++ 网络编程之一:什么是Boost.Asio?
简单来说,Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。 关于网络处理已经有很多解决方案,但是Boost.Asio是目前为止最优的方案。它在2005年就被包含进Boost,然后被大量Boost的用户测试并使用在许多项目中,比如:Remobo(http://www.remobo.com),可以让你创建你自己的即时私有网络(IPN);...原创 2018-02-01 17:24:04 · 4973 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之二:同步和异步
首先,异步编程和同步编程是截然不同的。在同步编程中,所有的操作都是顺序执行的,比如从socket中读取(请求),然后写入(回应)到socket中。每一个操作都是阻塞的。因为操作是阻塞的,所以为了不影响主程序,当在socket上读写时,通常会创建一个或多个线程来处理socket的输入/输出。因此,同步的服务端/客户端通常是多线程的。 相比之下,异步编程是事件驱动的。你启动了...原创 2018-02-01 18:40:17 · 4818 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之三:计时器
一些I/O操作需要一个超时时间。它只能应用在异步操作上(同步意味着阻塞,因此没有超时时间)。例如,下一条信息必须在100毫秒内从你的同伴那传递给你。bool read = false;void deadline_handler(const boost::system::error_code &) { std::cout << (read ? "read successfully" :原创 2018-02-01 19:29:26 · 1739 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之四:io_service类
你应该已经发现大部分使用Boost.Asio编写的代码都会使用几个io_service的实例。io_service是这个库里面最重要的类;它负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处理程序。 如果你选择用同步的方式来创建你的应用,你则不需要考虑我将在这一节向你展示的东西。 你有多种不同的方式来使用io_service。在下面的例子中,我们有3个异原创 2018-02-01 20:35:58 · 6366 阅读 · 3 评论 -
Boost.Asio C++ 网络编程之五:TCP回显客户端/服务端
回显就是服务端将接收到的任何内容回发给客户端显示,然后关闭客户端的连接。这个服务端可以处理任何数量的客户端。每个客户端连接之后发送一个消息,服务端接收到消息后把它发送回去。在那之后,服务端关闭连接。具体流程如下图所示。 对于TCP而言,我们需要一个额外的保证:每一个消息以换行符结束(‘\n’)。编写一个同步回显服务端/客户端非常简单。下面我们分别实现同步客户端,同步服务端...原创 2018-02-27 16:56:21 · 11673 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之六:UDP回显客户端/服务
因为UDP不能保证所有消息都抵达接收者,所以不能保证消息都以回车结尾。 在服务端,收到消息后,简单的回发给客户端,并且不关闭socket,因为这是UDP。一.UDP同步客户端UDP客户端比TCP客户端要简单:#ifdef WIN32#define _WIN32_WINNT 0x0501#include <stdio.h>#endif#include ...原创 2018-02-28 14:37:06 · 5138 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之七:基于TCP的同步客户端
从本篇开始,我们会深入学习怎样使用Boost.Asio建立更加复杂的客户端和服务端应用。你可以运行并测试它们,而且在理解之后,你可以把它们做为框架来构造自己的应用。在接下来的例子中:1.客户端使用一个用户名(无密码)登录到服务端2.所有的连接由客户端建立,当客户端请求时服务端回应3.所有的请求和回复都以换行符结尾(’\n’)4.对于5秒钟没有ping操作的客户端,服务端会自动断开其连接...原创 2018-02-28 19:10:12 · 1997 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之八:基于TCP的同步服务端
同步服务端也是相当简单的。它只需要两个线程,一个负责监听新的客户端连接,另外一个负责处理已经存在的客户端请求。它不能使用单线程,因为等待新的客户端连接是一个阻塞操作(因为accept()是阻塞的),因此我们需要另外一个线程来处理已经存在的客户端请求。基于TCP的同步服务端1.流程图2.实现#ifdef WIN32#define _WIN32_WINNT 0x0501#includ...原创 2018-02-28 19:24:52 · 1875 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之九:基于TCP的异步客户端
现在,是比较有趣(也比较难)的异步实现! 当查看流程图时,你需要知道Boost.Asio代表由Boost.Asio执行的一个异步调用。例如do_read(),Boost.Asio和on_read()代表了从do_read()到on_read()的逻辑流程,但是你永远不知道什么时候轮到on_read()被调用,你只是知道你最终会调用它。基于TCP的异步客户端1.流程图2.实现#ifde...原创 2018-03-01 14:19:32 · 3203 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之十:基于TCP的异步服务端
这个流程图是相当复杂的:从Boost.Asio出来你可以看到4个箭头指向on_accept,on_read,on_write和on_check_ping。这也就意味着你永远不知道哪个异步调用是下一个完成的调用,但是你可以确定的是它是这4个操作中的一个。基于TCP的异步服务端1.流程图2.实现#ifdef WIN32#define _WIN32_WINNT 0x0501#inclu...原创 2018-03-01 14:36:12 · 4384 阅读 · 0 评论 -
Boost.Asio C++ 网络编程之十一:deadline_timer使用说明
deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。一.构造函数在构造deadline_timer时指定时间。basic_deadline_time...原创 2018-03-01 16:52:49 · 4941 阅读 · 0 评论