连接服务器,并向服务器发送一个GET请求包,等待响应【同步方式】

连接服务器,并向服务器发送一个GET请求包,等待响应。

#include <iostream>  
#include <string>
using namespace std;

#include <boost/asio/ip/tcp.hpp >  
#include <boost/asio.hpp>  
using namespace boost;

typedef boost::asio::ip::tcp::resolver::query CQuery;
typedef boost::asio::io_service CIoSrv;
typedef boost::asio::ip::tcp::resolver CResolver;
typedef boost::asio::ip::tcp::resolver::iterator CIterator;
typedef boost::asio::ip::tcp::endpoint CEndPt;
typedef boost::asio::ip::tcp::socket CSocket;
typedef boost::system::error_code CErrorCode;
typedef boost::asio::streambuf CStreamBuf;

bool SendPkg(CSocket& sock);
void RequestBoostWeb()
{
	CQuery oQuery("www.boost.org", "http");//表示一个服务器的地址和服务类型
	cout << "HostName : " << oQuery.host_name() << endl;
	cout << "ServiceName : " << oQuery.service_name() << endl;

	CIoSrv oIoSrv;//IO服务对象来执行一个IO上的操作
	CResolver oResolver(oIoSrv);//来表示一个域名和服务类型的解释操作

	//进行域名或者服务解释,以便生成SOCKET内部使用的数据格式
	CIterator itBegin = oResolver.resolve(oQuery), itEnd;
	if(itBegin == itEnd)			return;

	//解释成功之后, 显示解释后的IP地址和端口
	CEndPt oEndPt = itBegin->endpoint();
	cout << "HostIp : " << oEndPt.address() << endl;
	cout << "SrvPort : " << oEndPt.port() << endl;

	//尝试连接服务器
	CErrorCode oErrorCode = boost::asio::error::host_not_found;
	CSocket oSocket(oIoSrv);
	//oSocket.close();
	oSocket.connect(*itBegin, oErrorCode);//创建一个同步连接,阻塞模式
	if(oErrorCode){
		cout << "连接出错!【error : " << oErrorCode << "】" << endl;
		return;
	}
	cout << "连接成功。" << endl;
	if(!SendPkg(oSocket)){
		cout << "发送数据包失败!" << endl;
		return;
	}
}

bool SendPkg(CSocket& sock){
	CStreamBuf oRequest;//HTTP请求包
	std::ostream oReqPkg(&oRequest);
	oReqPkg << "GET " << "http://www.boost.org/" << "HTTP/1.0\r\n";
	oReqPkg << "Host: " << "www.boost.org" << "\r\n";
	oReqPkg << "Accept: */*\r\n";
	oReqPkg << "Connection: close\r\n\r\n";
	boost::asio::write(sock, oRequest);//发送给服务器

	CStreamBuf oResponse;
	boost::asio::read_until(sock, oResponse, "\r\n");//接收来自服务器的响应
	std::istream oResPkg(&oResponse);
	string sHttpVersion; oResPkg >> sHttpVersion;
	UINT iStatusCode; oResPkg >> iStatusCode;
	string sStatusMsg; std::getline(oResPkg, sStatusMsg);
	cout << "HttpVersion : " << sHttpVersion << endl;
	cout << "StatusCode : " << iStatusCode << endl;
	cout << "StatusMessage : " << sStatusMsg << endl;
	return true;
}
//同步方式:客户端的每一个请求都要等到服务器响应后才会继续执行后面的操作;
//同步方式的逻辑比较好理解,开发简单,调试容易。
//但通过界面和用户交互时,可能在等待中失去响应【造成性能低下,交互不友好】
//异步方式:客户端请求没有得到及时的响应也不会等到,而是继续执行。
//等到服务器的响应到达客户端时,再执行预先定义的回调函数来处理。

猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80335145