Http Get請求簡單實例(C++)

HTTP報文

HTTP請求報文

請求行: GET /HTTP/1.1 格式:請求的方法 + http版本c++

首部字段瀏覽器

Host : 須要訪問的url (必須)服務器

**User-Agent:**請求瀏覽器類型網絡

**Accept-Language:**客戶端接收的天然語言socket

**Accept-Encoding:**客戶端接收的編碼壓縮格式tcp

**connection:**鏈接方式測試

C++代碼示例:ui

// HttpReq.cpp : 定義控制檯應用程序的入口點。
//

// HttpReq.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"

using namespace std;

bool HttpGetReq() {
	//1.初始化套接字庫
	WORD socket_version = MAKEWORD(2,2); //套接字版本
	WSADATA wsaData;
	int flag_init_socket = WSAStartup(socket_version,&wsaData);
	if (flag_init_socket!= 0)
	{
		cout << "初始化套接字失敗" << endl;
		return false;
	}

	//2.鏈接socket
	//AF_INET 指的是IPV4協議 //sock_stream 是有保障的(即能保證數據正確傳送到對方)面向鏈接的SOCKET與tcp協議相對應
	//IPPROTO_TCP:傳輸層採用的協議類型
	//socket參數含義:1.網絡層協議 2.傳輸數據的方式 3.傳輸層的協議類型
	SOCKET m_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
	const char* host_url = "www.baidu.com";
	struct hostent *host_info;
	host_info = gethostbyname(host_url);
	//host_info爲空 說明沒有該消息
	if (host_info == nullptr)
	{
		cout << "該主機url失敗!" << endl;
		return false;
	}

	//設置服務器SocketAddr類型--即包括ip地址和端口號
	//設置必要socket地址信息 服務器地址 端口號
	//其中端口號對應相應服務 --:80--》http服務 https://blog.csdn.net/qq_25184739/article/details/70653216
	SOCKADDR_IN SockAddr;
	SockAddr.sin_port = htons(80); //80端口表示http端口
	SockAddr.sin_family = AF_INET;
	SockAddr.sin_addr.s_addr = *((unsigned long*)host_info->h_addr); //請求服務器的地址 由host_info獲取

	//3.鏈接到服務器
   int flag_connect_socket = connect(m_socket,(SOCKADDR *)(&SockAddr),sizeof(SockAddr));
   if (flag_connect_socket!=0)
   {
	   cout << "connect to server fail!" << endl;
	   return false;
   }

   //4.發送GET請求 
   //設置get請求報文
   const char * req_header = "GET /HTTP/1.1\r\n"; //請求頭
   const char* total_req_header  = "Host:www.baidu.com\r\nConnection: close\r\n\r\n";
   const char* all_req_header = "GET / HTTP/1.1\r\nHost:www.baidu.com\r\nConnection: close\r\n\r\n";
   send(m_socket,all_req_header,strlen(all_req_header),0);

   //5.接收服務器響應的數據
   char recvBuffer[10000];
   int recvDataLength;
   while ((recvDataLength = recv(m_socket,recvBuffer,10000,0))> 0)
   {
	   cout << "傳回的數據爲:\n"<< endl;
	   int i = 0;
	   while (recvBuffer[i] >= 32 || recvBuffer[i] == '\n' || recvBuffer[i] == '\r') {
		   cout << recvBuffer[i];
		   i += 1;
	   }
	   break;
   }
   
   //6.關閉鏈接
   closesocket(m_socket);
   WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{
	HttpGetReq();
	cout << "\n測試結束" << endl;
	int mm ;
	cin>> mm;
	return 0;
}


複製代碼

運行結果:編碼

相關文章
相關標籤/搜索