Boost.Asio基础
Network API
Boost.Asio 命名空间
boost::asio命名空间包含了Boost Asio库的所有东西,它下面还有一些子命名空间:
- boost::asio: 它包含了核心的类和功能模块。最重要的类是io_service和streambuf。里面还有一些自由函数,read,read_at,read_util,write等,以及它们的异步的版本。
- boost::asio::ip: 重要的类有address,endpoint,tcp,udp,icmp和自由函数connect、async_connect。
- boost::asio::error: 包含了使用I/O过程总碰到的错误代码。
- boost::asio::ssl: 包含处理SSL的一些类。
- boost::asio::local: 包含POSIX特定的类。
- boost::asio::windows: 包含Windows平台特定的类。
IP地址
Boost.Asio提供了ip::address类,来处理IP地址,有两个实现,ip_address_v4和ip_address_v6。
它们有的功能都不多,其中最重要的有:
- ip::address(v4_or_v6_address): 这个函数把一个v4或者v6的地址转换成ip::address
- ip::address::from_string(str): 这个函数从IPv4(以点分割开)或者IPv6(16进制表示)地址来创建一个地址对象。
- ip::address::to_string(): 这个函数返回易读的地址字符串
- ip::address_v4::broadcast([addr, mask]): 这个函数创建一个广播地址
- ip::address_v4::any(): 这个函数返回一个可以表示任意地址的ip::address
- ip::address_v4::loopback(), ip::address_v6::loopback(): 返回回环地址
- ip::host_name(): 以字符串的形式,返回当前主机的名称。
大多数时候,我们使用ip::address::from_string:
ip::address addr = ip::address::from_string("127.0.0.1");
要是想连接到一个指定名称的主机,下面的是错误的:
//throw an exception:
ip::address addr = ip::address::from_string("www.baidu.com");
端点(Endpoints)
端点就是你要连接的地址,它还有个叫端口的属性。每一个不同的socket类型都有属于它自己的endpoint类,比如ip::tcp::endpoint,ip::udp::endpoint,和ip::icmp::endpoint。
例如,你想连接到本地的80端口,代码如下:
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 80);
有3中方法创建endpoint:
- endpoint(): 默认构造函数,可以用于UDP/ICMP socket
- endpoint(protocol, port): 通常用于服务器端socket,用来接受新的连接
- endpoint(addr, port): 由给定的地址和端口来创建endpoint
示例:
ip::tcp::endpoint ep1;
ip::tcp::endpoint ep2(ip::tcp::v4(), 80);
ip::tcp::endpoint ep3(ip::address::from_string("127.0.0.1"), 80);
如果是要连接到一个指定名称的主机(不是IP地址):
io_service service;
ip::tcp::resolver resolver(service);
ip::tcp::resolver::query query("www.baidu.com", "80");
ip::tcp::resolver::iterator iter = resolver.resolver(query);
ip::tcp::endpoint ep = *iter;
std::cout << ep.address().to_string() <<std::endl;
可以替换tcp为其他类型的socket。
给定一个endpoint,可以获取它的地址、端口和IP协议等信息:
std::cout << ep.address().to_string() << "." << ep.port()
<< "/" << ep.protocal() << std::endl;