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

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

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

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

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

class CClient{
private:
	CSocket oSocket;//收发数据
	CResolver oResolver;//解释域名
	CStreamBuf oSendBuff;//发送缓冲区
	CStreamBuf oRecvBuff;//接收缓冲区
public:
	CClient(string& host, string srv, CIoService& iosrv) : oResolver(iosrv), oSocket(iosrv){
		std::ostream oReqPkg(&oRecvBuff);
		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";  

		//发送解释域名请求
		CQuery oQuery(host, srv);
		oResolver.async_resolve(oQuery, boost::bind(&CClient::ResolveHandler, this, 
			boost::asio::placeholders::error, boost::asio::placeholders::iterator));
	}
	//域名解释回应
	void ResolveHandler(const CErrorCode& err, CIterator it){
		if(!err){//准备连接解释后的IP地址, 以便连接到服务器
			CEndPoint oEndPt = *it;
			oSocket.async_connect(oEndPt, boost::bind(&CClient::ConnectHandler, this, 
				boost::asio::placeholders::error, ++it));
		}
		else{
			cout << "ResolveError : " << err.message() << endl;
		}
	}
	//连接到服务器成功或者失败
	void ConnectHandler(const CErrorCode& err, CIterator it){
		if(!err){//连接到服务器成功,接着发送请求数据给服务器
			boost::asio::async_write(oSocket, oSendBuff, boost::bind(&CClient::WriteHandler, this,
				boost::asio::placeholders::error));
		}
		else if(it != CIterator()){//连接服务器失败,继续连接下一个服务器的端点
			oSocket.close();
			CEndPoint oEndPt = *it;
			oSocket.async_connect(oEndPt, boost::bind(&CClient::ConnectHandler, this,
				boost::asio::placeholders::error, ++it));
		}
		else{
			cout << "ConnectError : " << err.message() << endl;
		}
	}
	//当发送请求数据给服务器之后处理
	void WriteHandler(const CErrorCode& err){
		if(!err){//发送给服务器成功之后,就可以读取服务器回应的数据
			boost::asio::async_read_until(oSocket, oRecvBuff, "\r\n",
				boost::bind(&CClient::AfterGet, this, boost::asio::placeholders::error));
		}
		else{
			cout << "WriteError : " << err.message() << endl;
		}
	}
	//处理服务器回应的数据完整状态行数据
	void AfterGet(const CErrorCode& err){
		if(!err){//分析回应的数据
			std::istream oResPkg(&oRecvBuff);  
			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;  
		}
		else{
			cout << "DataError : " << err.message() << endl;
		}
	}
};  

void main()
{
	std::string sHost("www.boost.org");
	std::string sSrv("http");
	CIoService oIoSrv;//定义IO服务对象
	CClient oClient(sHost, sSrv, oIoSrv);
	oIoSrv.run();
}

猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80346015
今日推荐