zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

boost库在工作(27)网络客户端之二

网络客户端 工作 27 之二 Boost
2023-09-14 09:10:43 时间
由于一台服务器上可能存在多个服务,而每个服务使用了不同的端口,因而对一台服务器的查询,就可能返回多个服务的端口。为了表示多个服务,需要使用一个列表来表达多个服务存在。而访问一个列表,通常使用迭代设计模式来访问整个列表。因此就会使用下面的代码来进行域名解释:
// 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

请按任意键继续. . .