今天我们来学习与Boost.Asio相关的变量和函数
1. boost::asio::ip::address
表示一个通用 IP 地址对象,可以是 IPv4,也可以是 IPv6 eg:boost::asio::ip::address ip_address=boost::asio::ip::make_address("127.0.0.1");2. boost::system::error_code
//错误码 用来保存错误信息,避免直接抛异常boost::system::error_code ec;ec.value()判断是否成功执行 返回值0成功!=0错误 ec.message()返回错误描述文本 eg:boost::system::error_code ec;std::cout<<"Error , code is "<<ec.value()<<" Message is "<<ec.message();3. boost::asio::ip::tcp::endpoint
表示一个 TCP 端点,本质上是 IP 地址+端口号 boost::asio::ip::tcp::endpoint(constaddress&addr,unsignedshortport_num);参数 addr:一个 ip::address 对象 port_num:端口号 eg:boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);uint16_tport_num=8888;boost::asio::ip::tcp::endpointep(ip_address,port_num);5. boost::asio::ip::make_address()函数
//作用 把字符串形式的 IP 地址转换成 asio::ip::address 对象,它既能解析 IPv4,也能解析 IPv6addressmake_address(constchar*str,boost::system::error_code&ec);带错误处理 addressmake_address(constchar*str);不带错误处理 参数 str:想要转换的原始 IP 地址字符串 ec:输出参数 用于捕获转换过程中发生的错误 返回值 一个boost::asio::ip::address对象 既可以存 IPv4 也可以存 IPv6 eg:std::string raw_ip_address="127.0.0.1";boost::system::error_code ec;boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address,ec);6. boost::asio::ip::address_v6::any()与boost::asio::ip::address_v4::any()
boost::asio::ip::address_v6::any()返回 IPv4 的任意地址,也就是“本机所有 IPv4 地址” boost::asio::ip::address_v4::any()返回 IPv6 的任意地址,也就是“本机所有 IPv6 地址”7. boost::asio::io_context
io_context是Asio的I/O执行上下文 eg:boost::asio::io_context ioc;//创建一个 I/O 环境8. boost::asio::ip::tcp::v4()与boost::asio::ip::tcp::v6()
boost::asio::ip::tcp::v4()表示 TCP over IPv4 协议对象、指定后面要用 IPv4 TCP 协议 boost::asio::ip::tcp::v6()表示 TCP over IPv6 协议对象、指定后面要用 IPv6 TCP 协议9. asio::ip::tcp::socket
表示一个 TCP 套接字对象explicitsocket(boost::asio::io_context&io_context);socket(boost::asio::io_context&io_context,consttcp&protocol);指定协议 参数 io_context:上下文 protocol:端口指定协议 通常传入 tcp::v4()或 tcp::v6()eg:boost::asio::io_context ioc;boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);uint16_tport_num=8888;boost::asio::ip::tcp::endpointep(ip_address,port_num);boost::asio::ip::tcp::socketsock(ioc);boost::asio::ip::tcp::socketsock(ioc,ep.protocol());10. sock.connect()
把当前 socket 连接到指定端点 eg:boost::asio::io_context ioc;boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);uint16_tport_num=8888;boost::asio::ip::tcp::endpointep(ip_address,port_num);boost::asio::ip::tcp::socketsock(ioc);boost::asio::ip::tcp::socketsock(ioc,ep.protocol());sock.connect(ep)11. boost::asio::ip::tcp::acceptor
表示 TCP 服务端监听器,它负责监听端口并接受客户端连接,不负责真正的数据收发acceptor(boost::asio::io_context&io_context,consttcp::endpoint&endpoint,boolreuse_addr=true);参数 io_context:上下文 endpoint:端口+IP地址 reuse_addr:隐藏的默认参数 eg:boost::asio::io_context ioc;boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);uint16_tport_num=8888;boost::asio::ip::tcp::endpointep(ip_address,port_num);boost::asio::ip::tcp::acceptoracceptor(ioc,ep);12. acceptor.bind()
把 acceptor 绑定到本地端点,也就是把某个地址和端口交给当前程序占用 boost::system::error_codebind(constendpoint_type&endpoint,boost::system::error_code&ec);参数 endpoint:端口+IP地址 ec:错误码 eg:boost::system::error_code ec;boost::asio::io_context ioc;boost::asio::ip::address ip_address=boost::asio::ip::make_address(raw_ip_address);uint16_tport_num=8888;boost::asio::ip::tcp::endpointep(ip_address,port_num);boost::asio::ip::tcp::acceptoracceptor(ioc,ep);acceptor.bind(ep,ec);13. acceptor.listen()
让 acceptor 开始进入监听状态,准备接收连接请求voidlisten(intbacklog=boost::asio::socket_base::max_listen_connections);参数 backlog:挂起连接队列的最大长度 eg:constintBACKLOG_SIZE=128;acceptor.listen(BACKLOG_SIZE);14. acceptor.accept()
接受一个新的客户端连接,并把这个连接交给socket eg:acceptor.accept(sock);15. boost::asio::ip::tcp::resolver()
做域名解析 eg:boost::asio::io_context ioc;boost::asio::ip::tcp::resolverresolver(ioc);16. resolver.resolve()
把主机名+服务名/端口解析成一个或多个 endpoint 结果 results_typeresolve(string_view host,string_view service,resolver_base::flags flags);参数 host:主机名 可以是域名"goole.com"或具体的 IP 地址字符串"127.0.0.1"service:服务名/端口 flags:解析标志 passive:用于服务器端。返回的地址将适合用于 bind。 canonical_name:请求返回主机的规范名称 numeric_host:强制要求 host 必须是数字形式的 IP,不进行 DNS 查询(提高速度) numeric_service:强制要求 service 必须是数字端口号 v4_mapped:如果没有找到 IPv6 地址,则返回映射到 IPv6 的 IPv4 地址 返回值 一个迭代器范围 eg:autoresults=resolver.resolve(host,port_num,boost::asio::ip::resolver_base::numeric_service);17. boost::asio::connect()
尝试把 socket 连接到解析结果中的某个可用 endpointtemplate<typenameProtocol,typenameEndpointSequence>typenameProtocol::endpointconnect(basic_socket<Protocol>&s,constEndpointSequence&endpoints);参数 s:创建的socket对象的引用 endpoints:resolver.resolve()的返回值 eg:boost::asio::connect(sock,results);