⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpclient.cpp

📁 本人买的<<VC++项目开发实例>>源代码配套光盘.
💻 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 + -