Http Get请求简单实例(C++)

转载自:掘金https://juejin.cn/post/6844903897161531400

Http Get请求简单实例(C++)

HTTP报文

HTTP请求报文

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

首部字段

Host : 需要访问的url (必须)

**User-Agent:**请求浏览器类型

**Accept-Language:**客户端接收的自然语言

**Accept-Encoding:**客户端接收的编码压缩格式

**connection:**连接方式

C++代码示例:

// 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;
}


复制代码

运行结果:

文章分类

后端

文章标签

正在上传…重新上传取消​

HTTP

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值