由于一台服务器上可能存在多个服务,而每个服务使用了不同的端口,因而对一台服务器的查询,就可能返回多个服务的端口。为了表示多个服务,需要使用一个列表来表达多个服务存在。而访问一个列表,通常使用迭代设计模式来访问整个列表。因此就会使用下面的代码来进行域名解释:
// boost_020.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <boost/asio/ip/tcp.hpp >
#include <boost/asio.hpp>
#include <iostream>
//测试网络服务查询
//软件开发人员: 蔡军生 2013-06-02
//QQ: 9073204
void Test(void)
{
//定认一个查询端点对象。
boost::asio::ip::tcp::resolver::query query("www.boost.org", "http");
std::cout << "host_name: " << query.host_name() << " service_name:" << query.service_name()
<< std::endl;
//定义IO服务对象。
boost::asio::io_service ioService;
//定义解释对象。
boost::asio::ip::tcp::resolver resolver(ioService);
//进行域名或者服务解释,以便生成SOCKET内部使用的数据格式。
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::resolver::iterator itEnd;
if (iterator == itEnd)
{
return;
}
//解释成功之后, 显示解释后的IP地址和端口。
boost::asio::ip::tcp::endpoint endpoint = iterator->endpoint();
std:: cout << "host_ip: " << endpoint.address() << " port: " << endpoint.port() << std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Test();
system("pause");
return 0;
}
在这个例子里,使用query来表示一个服务器的地址和服务类型,使用io_service来执行一个IO上的操作,使用resolver来表示一个域名和服务类型的解释操作,使用endpoint来表示一个端点的存在。所谓有端点,就是一个IP地址、一个服务、一种类型的综合体。就算同一个IP,同一个服务,也会有两个端点,因为IP地址的类型有两种:IPv4和IPv6。通过resolver对象解释回来的端点endpoint是直接可以使用到boost网络库的对象使用。如果存在多个端点的情况,就需要进行一个遍历操作,以便找到合适的端点连接。当然,也会有解释出错的情况,或者根本就不存在这个服务器,那么从resolver解释返回的结果集就会是空,这样它可以跟一个定义为空集的端点itEnd进行比较了,避免再进行下面的操作。
这个例子运行正确地输出如下:
host_name: www.boost.org service_name:http
host_ip: 129.79.13.33 port: 80
请按任意键继续. . .