使用与套接字具有相同协议的解析器。例如,tcp::socket::connect()
预计tcp::endpoint
,并且通过udp::resolver::iterator
提供的端点类型是udp::endpoint
。试图直接使用查询的结果从一个不同的协议将导致编译错误:
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket socket(io_service);
boost::asio::ip::udp::resolver::iterator iterator = ...;
socket.connect(iterator->endpoint());
// ~~~^~~~~~~ no matching function call to `tcp::socket::connect(udp::endpoint)`
// no known conversion from `udp::endpoint` to `tcp::endpoint`
既不tcp::resolver
也不udp::resolver
口授传输层协议名称解析将使用。当DNS客户端成为必要时,或者它已被明确配置为使用TCP时,DNS客户端将使用TCP。
在支持服务名称解析的系统上,使用描述性服务名称执行服务名称解析时,解析器的类型会影响结果。例如,在IANA Service Name and Transport Protocol Port Number Registry:
- 的
daytime
服务使用端口13上的UDP和TCP
- 的
shell
服务使用端口514仅在TCP
- 的
syslog
服务仅在UDP
使用端口514
因此,可以使用tcp::resolver
来解析daytime
和shell
服务,但不能解析syslog
。另一方面,udp::resolver
可以解析daytime
和syslog
,但不能解析shell
。以下示例演示了这种区别:
#include <boost/asio.hpp>
int main()
{
boost::asio::io_service io_service;
using tcp = boost::asio::ip::tcp;
using udp = boost::asio::ip::udp;
boost::system::error_code error;
tcp::resolver tcp_resolver(io_service);
udp::resolver udp_resolver(io_service);
// daytime is 13/tcp and 13/udp
tcp_resolver.resolve(tcp::resolver::query("daytime"), error);
assert(!error);
udp_resolver.resolve(udp::resolver::query("daytime"), error);
assert(!error);
// shell is 514/tcp
tcp_resolver.resolve(tcp::resolver::query("shell"), error);
assert(!error);
udp_resolver.resolve(udp::resolver::query("shell"), error);
assert(error);
// syslog is 514/udp
tcp_resolver.resolve(tcp::resolver::query("syslog"), error);
assert(error);
udp_resolver.resolve(udp::resolver::query("syslog"), error);
assert(!error);
tcp_resolver.resolve(tcp::resolver::query("514"), error);
assert(!error);
udp_resolver.resolve(udp::resolver::query("514"), error);
assert(!error);
}