📄 httpclient.cpp
字号:
// HttpClient.cpp: implementation of the CHttpClient class.
//
//////////////////////////////////////////////////////////////////////
#include "HttpClient.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CHttpClient::CHttpClient()
{
if ( !InitSocket())
{
throw new int(E_HC_SOCKET_ENV);
}
}
CHttpClient::~CHttpClient()
{
WSACleanup();
}
std::string *CHttpClient::GET(const char * lpServerName, const char *lpPort, const char *lpURL, const char *lpExtraHeaderInfo)
{
//
// 格式化HTTP请求
//
char szGetBuffer[4097];
sprintf(szGetBuffer, "GET %s HTTP/1.0\r\n"
"accept: */*\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)\r\n"
"%s"
"\r\n",
lpURL, lpExtraHeaderInfo);
return HTTPMethod(lpServerName, lpPort, lpURL, szGetBuffer);
}
void CHttpClient::InitServerAddress(const char * lpServerName, const char *lpPort, SOCKADDR_IN &saServer)
{
//
// 使用 inet_addr() 判断给的lpServerName是一个机器名称还是一个IP地址
//
IN_ADDR iaHost = {0}; //Host IP Address using dot format
iaHost.s_addr = inet_addr(lpServerName);
if (iaHost.s_addr == INADDR_NONE)
{
LPHOSTENT lpHostEntry = {0}; //Host Information
// Wasn't an IP address string, assume it is a name
lpHostEntry = gethostbyname(lpServerName);
if (lpHostEntry != NULL)
{
iaHost.s_addr = (*((LPIN_ADDR)*lpHostEntry->h_addr_list)).s_addr;
}
else
{
throw new int(E_HC_SERVER_IP_ERROR);
}
}
//
// give the port number for the HTTP service on TCP
//
saServer.sin_port = htons(atoi(lpPort));
//
// Fill in the rest of the server address structure
//
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = iaHost.s_addr;
}
std::string *CHttpClient::HTTPMethod(const char *lpServerName, const char *lpPort, const char *lpURL, const char *szMethodRequest)
{
SOCKADDR_IN saServer;
memset(&saServer, 0, sizeof(saServer));
/*
* 使用了STL的string
*/
std::string *p_stl_str_buf = new std::string("");
SOCKET Socket = INVALID_SOCKET;
try
{
InitServerAddress(lpServerName, lpPort, saServer);
//
// Create a TCP/IP stream socket
//
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == Socket)
{
throw new int(E_HC_SOCKET_CREATE);
}
//
// Connect the socket
//
int nRet = connect(Socket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == nRet)
{
throw new int(E_HC_CONNECT_ERROR);
}
nRet = send(Socket, szMethodRequest, strlen(szMethodRequest), 0);
if (SOCKET_ERROR == nRet)
{
throw new int(E_HC_SEND_ERROR);
}
while(true)
{
char szRespBuf[RESPONSE_BUFFER_SIZE];
memset(szRespBuf, 0, RESPONSE_BUFFER_SIZE);
// Wait to receive, nRet = NumberOfBytesReceived
nRet = recv(Socket, szRespBuf, RESPONSE_BUFFER_SIZE - 1, 0);
if (SOCKET_ERROR == nRet)
{
throw new int(E_HC_RECV_ERROR);
}
else
{
if (0 == nRet) //Did the server close the connection?
{
break;
}
else //continue to recv...
{
p_stl_str_buf->append(szRespBuf);
}
}
}
closesocket(Socket);
return p_stl_str_buf; //正常返回
}
catch(int *e)
{
switch(*e)
{
case E_HC_CONNECT_ERROR:
case E_HC_SEND_ERROR:
case E_HC_RECV_ERROR:
closesocket(Socket);
break;
case E_HC_SERVER_IP_ERROR:
case E_HC_SOCKET_CREATE:
break;
default:
break;
}
delete e;
*p_stl_str_buf = "";
return p_stl_str_buf;
}
}
bool CHttpClient::InitSocket()
{
WORD wVersionRequested = MAKEWORD(1,1); //Socket Version
WSADATA wsaData; //Initiation data
int nRet;
nRet = WSAStartup(wVersionRequested, &wsaData);
if (nRet)
{
return false;
}
//
// Check WinSock version
//
if (wsaData.wVersion != wVersionRequested)
{
return false;// WSACleanup是由析构函数来完成的,在delete之中进行
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -