欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

boost库使用—asio库

程序员文章站 2022-05-31 21:46:17
...

boost库使用—asio库

****

一、boost库asio简介

Boost Asio ( asynchronous input and output)关注异步输入输出。Boost Asio库提供了平台无关性的异步数据处理能力(当然它也支持同步数据处理)。一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功。Boost Asio将数据传输分为两个独立的步骤:

  1. 采用异步任务的方式开始 数据传输。
  2. 将传输结果通知调用端

​ 与传统方式相比,优点在于程序在数据传输期间不会阻塞。


二、API介绍

Boost.Asio的所有内容都包含在boost::asio命名空间或者其子命名空间内。

  • boost::asio:这是核心类和函数所在的地方。重要的类有io_service和streambuf。类似read, read_at, read_until方法,它们的异步方法,它们的写方法和异步写方法等*函数也在这里。
  • boost::asio::ip:这是网络通信部分所在的地方。重要的类有address, endpoint, tcp, udp和icmp,重要的*函数有connectasync_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特性的类

IP地址

对于IP地址的处理,Boost.Asio提供了ip::address , ip::address_v4ip::address_v6类。 它们提供了相当多的函数。下面列出了最重要的几个:

  • ip::address(v4_or_v6_address):这个函数把一个v4或者v6的地址转换成ip::address
  • ip::address:from_string(str):这个函数根据一个IPv4地址(用.隔开的)或者一个IPv6地址(十六进制表示)创建一个地址。
  • ip::address::to_string() :这个函数返回这个地址的字符串。
  • ip::address_v4::broadcast([addr, mask]):这个函数创建了一个广播地址 ip::address_v4::any():这个函数返回一个能表示任意地址的地址。
  • ip::address_v4::loopback(), ip_address_v6::loopback():这个函数返回环路地址(为v4/v6协议)
  • ip::host_name():这个函数用string数据类型返回当前的主机名。

大多数情况你会选择用ip::address::from_string

ip::address addr = ip::address::from_string("127.0.0.1");

如果你想通过一个主机名进行连接,下面的代码片段是无用的:

// 抛出异常
ip::address addr = ip::address::from_string("www.yahoo.com");


三、案例

同步客户端+服务端

cli:

#include <iostream>
#include <boost/asio.hpp>

using namespace std;

int main()
try
{
	cout << "client start...." << endl;
	//io_service对象
	boost::asio::io_service ios;
	//创建socket对象
	boost::asio::ip::tcp::socket sock(ios);
	//创建连接端
	boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"),6688);
	//连接
	sock.connect(ep);
	//定义一个缓冲区
	//vector<char>str(100,0);
	char data[128];
	sock.read_some(boost::asio::buffer(data));
	cout << "recive from "<<sock.remote_endpoint().address() << endl;
	cout << data << endl;
	system("pause");
	return 0;
}
catch (exception& e)
{
cout << e.what()<< endl;
}

ser:

#include <iostream>
#include <boost/asio.hpp>

using namespace std;

int main()
try
{
	cout << "server start..." << endl;
	//io_service对象
	boost::asio::io_service ios;
	//绑定端口6688
	boost::asio::ip::tcp::acceptor acceptor(ios,
		boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),6688));
	cout << acceptor.local_endpoint().address() << endl;
	while (1)
	{
		//socket对象
		boost::asio::ip::tcp::socket sock(ios);
		//阻塞等待socket连接
		acceptor.accept(sock);
		cout << "client:" ;
		cout << sock.remote_endpoint().address() << endl;
		sock.write_some(boost::asio::buffer("hello asio"));

	}
	return 0;
}
catch (exception& e)
{
	cout <<e.what() << endl;
}



想了解学习更多C++后台服务器方面的知识,请关注:
微信公众号:C++后台服务器开发