boost::asio库支持TCP、UDP和ICMP通信协议,在名字空间boost::asio::ip中提供大量网络通信方面的函数和类。
| class | context |
|---|---|
| tcp | ip::tcp是asio主要用于TCP协议的类,内部类型endpoint、socket、acceptor和resolver是TCP通信最核心的一组类,封装了socket的连接、断开和数据收发等功能 |
| address | ip::address表示IP地址,独立于TCP、UDP等通信协议,可以同时支持ipv4和ipv6,其静态成员from_string()是一个工工厂函数,可以从字符串产生ip地址,地址版本可以用is_v4()和is_v6()来检测,to_string()可以把ip地址转换为字符串 |
| endpoint | ip::tcp::endpoint用来表示端口号,通过构造函数创建一个可用于Socket通信的端点对象,端点的地址和端口号可以用address()和port()获得 |
| socket | TCP通信的基本类,可以在构造时就指定使用的协议和endpoint,或调用成员函数connect();连接成功后可以使用local_endpoint()和remote_endpoint()获得两端点信息;用available()获取可读取的字节数;用receive()/read_some()和send()/write_some()读写数据,参数是buffer类型,用buffer()函数进行包装;当操作完成后使用close()关闭socket |
| acceptor | 构造时传入endpoint开始侦听,调用accept()接受新的连接 |
| resolver | ip::tcp::resolver通过域名获得可用的IP地址,可以实现与IP版本无关的网址解析 |
| io_service | asio::io_service类提供核心的I/O操作函数,提供了任务队列和任务分发功能,在异步编程中显式调用了io_service.run(),程序中的异步操作会添加至任务队列,由run()循环执行直到全部执行完毕。io_service是完全线程安全的队列。以上类大都需要io_service作为构造参数。 |
一、同步or异步
同步:所有操作都是顺序执行,如从socket中读取(请求),然后写入(回应)到socket中,每一个操作都是阻塞的。一般情况下会采取多线程的方式来进行socket的io操作。
异步:事件驱动,启动操作时会提供一个回调(感觉与C#的委托事件类似),操作结束后会自动返回结果。在异步编程中只需要一个线程。
1. 连接过程
客户端client
a.创建io_server实例(在Boost1.66后的版本为io_context)
boost::asio::io_service io_service;
b.创建连接的地址IP和端口port,在Boost::Asio中提供endpoint(ip,port)进行两者的绑定
unsigned short port = 8080;
auto const address = boost::asio::ip::address_v4::from_string("192.168.0.123");
boost::asio::ip::tcp::endpoint endpoint(address,port);
c.创建socket实例,并建立到endpoint的socket连接
boost::asio::ip::tcp::socket socket(io_service);
socket.connect(endpoint);//同步
socket.async_connect(endpoint,[](){});//异步,需要回调函数,这里使用的是lambda表达式
服务器端server
a.创建io_server实例(在Boost1.66后的版本为io_context)
boost::asio::io_service io_service;
b.设置要接受连接的端口和协议类型
unsigned short port = 8080;
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(),port);//ipv4,侦听端口8080
c.创建acceptor实例,并开始侦听Socket连接
boost::asio::ip::tcp::socket socket(io_service);
acceptor.accept(socket)//同步,运行到此处时会阻塞线程知道侦听到client的连接请求
socket.async_accept(socket,[](){});//异步,需要回调函数,这里使用的是lambda表达式
d.对Socket进行读写操作,客户端相同
boost::asio::write(socket,boost::asio::buffer("hello world!")); //向socket中写入字符
std::cout<<socket.available()<<std::endl; //获取可读取的字节数
std::vector<char> str(socket.available()+1,0); //定义一个vector缓冲区 socket.receive(boost::asio::buffer(str)); //使用buffer()包装缓冲区并接收数据
std::cout<<"client received: "<<&str[0]<<std::endl;//输出接收到的字符串
*在boost::asio中进行网络连接的具体表达方式有多种,但是连接过程基本如上。
2. 同步编程实例
客户端client
//**************************tcpClient.h***************************
#include <boost/asio.hpp>
using tcp=boost::asio::

8144

被折叠的 条评论
为什么被折叠?



