c++之Boost学习笔记总结(2)--asio

解析Boost.Asio

Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 涉及到两个重要的概念:io服务和io对象,理解掌握好这两个东西,便走上光明大道。

想用通俗易懂的方式理解io服务,看了那么多,还是下面的概念模型图最好:
在这里插入图片描述

io服务
从第一个boost.asio的教程开始,boost文档就一直在告诉我们:使用boost.asio第一步就是要创建一个io_service对象。那么io_service是个什么东西呢?

   就是用来初始化io对象,提供和底层系统进行io的一个东西;

boost::asio::io_service io_serv;
甭管它底层是干嘛的,盘他!!所有网络异步编程中,先给他创建一个io_service,待会的socket就用io_serv初始化,io对象的异步操作比如socket.async_connect()、socket.async_read等操作,都在io服务启动后实现,所以io_serv.run()这个函数很重要,它是启动io服务的。

io对象

socket相信你应该不陌生,它就是一种io对象,除此之外还有定时器,域名解析器等对象。
如上面的模型图所示,应用程序必须有一个io_service对象. io_service对象负责连接应用程序与操作系统的IO服务.
boost.asio文档说,io_service为下面的这些异步IO对象提供最核心的IO功能:
boost::asio::ip::tcp::socket
boost::asio::ip::tcp::acceptor
boost::asio::ip::tcp::resolve
boost::asio::ip::udp::socket
boost::asio::deadline_timer.

初步的认识后,还是动手敲了下基于boost::asio的c/s模型,

客户端:

#include<iostream> 
#include<boost\asio.hpp>
#include<boost\system\system_error.hpp>
#include<string> 
using boost::asio::ip::tcp;
//第一步
boost::asio::io_service io_serv;//创建io服务
tcp::socket socket_(io_serv);//初始化io对象sock
boost::array<char, 4096>recv_buffer;//

//第四步
void handle_write(){.......}
//第五步
void handle_read(){.......}

//第三部,异步处理连接成功任务
void handle_connect(boost::system::error_code &ec)
{
	if(!ec)
	{
	//向服务器发送数据
	boost::asio::async_write(socket_,boost::buffer("hello,server"),boost::bind(handle_write,this,boost::asio::placeholeders::error));
	//收取服务器发来的数据
	boost::asio::async_read(socket_,boost::buffer(recv_buffer,1024),boost::bind(handle_read,this,boost::asio::placeholeders::error));
	
	}
}
void main() { 

string address="192.168.26.163";
unsigned int port=6672;
tcp::endpoint endpoint(boost::asio::ip::address_v4::from_string(address.c_str()), port);
//第二步,异步连接,在连接后异步处理handle_connect()
socket_.async_connect(endpoint, boost::bind(handle_connect, this,boost::asio::placeholders::error));

//启动io服务后,io对象的异步操作才开始执行
io_serv.run();

}

服务端:
相比于客户端,服务端需要一个监听的接受对象,即是acceptor,所以在客户端的基础上,加如下代码:

//第一步,服务端需要绑定一个ip和port
tcp::endpoint endpoint(tcp::v4(),6672);
//第二补,创建一个acceptor对象
tcp::acceptor acceptor(io_service,endpoint);

//第三部,异步监听连接的socket,并处理实现函数
acceptor.async_accept(socket_,boost::bind(handle_accept,this,boost::asio::placeholders::error);

后面参考源码链接:
boos的asio实现简单客户端和服务端模型

猜你喜欢

转载自blog.csdn.net/weixin_42047032/article/details/86496616