boost库使用—asio库
程序员文章站
2022-05-31 21:46:17
...
boost库使用—asio库
****
一、boost库asio简介
Boost Asio ( asynchronous input and output)关注异步输入输出。Boost Asio库提供了平台无关性的异步数据处理能力(当然它也支持同步数据处理)。一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功。Boost Asio将数据传输分为两个独立的步骤:
- 采用异步任务的方式开始 数据传输。
- 将传输结果通知调用端
与传统方式相比,优点在于程序在数据传输期间不会阻塞。
二、API介绍
Boost.Asio的所有内容都包含在boost::asio命名空间或者其子命名空间内。
- boost::asio:这是核心类和函数所在的地方。重要的类有io_service和streambuf。类似read, read_at, read_until方法,它们的异步方法,它们的写方法和异步写方法等*函数也在这里。
- boost::asio::ip:这是网络通信部分所在的地方。重要的类有address, endpoint, tcp, udp和icmp,重要的*函数有connect和async_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_v4和ip::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++后台服务器开发
上一篇: 数据库的基本查询操作
下一篇: 数据库基本操作
推荐阅读
-
Mint UI组件库CheckList使用及踩坑总结
-
Delphi在Android下使用Java库的方法
-
php在数据库抽象层简单使用PDO的方法
-
Python使用Pandas库常见操作详解
-
CentOS中使用Shell脚本实现每天自动备份网站文件和数据库并上传到FTP中
-
.Net Core API使用ODP.NET操作Oracle数据库
-
Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
-
在Python的Flask框架下使用sqlalchemy库的简单教程
-
使用$.get()根据选项的不同从数据库异步请求数据
-
JSP中的PreparedStatement对象操作数据库的使用教程