连接服务器,并向服务器发送一个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(); }