C++发起Https连接请求

需要下载安装openssl

//stdafx.h
#pragma once
#include<iostream>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <iostream>
#include <string>#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")
//https.h
#pragma once
#include"stdafx.h"
#include <unordered_map>
using namespace std;
//class Head
//{
//public:
//	string name, value;
//	Head(const char*name,const char*value);
//	Head(string lines);
//	void load_str(string lines);
//};
class Https
{
private:bool is_ok,is_connect;int ResponseCode;
public:std::unordered_map<string, string> ResPons;static bool is_init;void Init();string Url;string Host;string Url_ssl;string request;SSL_CTX * ctx;BIO* bio;Https(string url);int connect();int getResponseCode();void disconnect();void set_headers(string headers);int read(char*buffer, int len);~Https();
};
//https.cpp
#include"https.h"
bool Https::is_init = false;
void Https::Init()
{SSL_library_init();SSL_load_error_strings();OpenSSL_add_all_algorithms();Https::is_init = true;
}
void ConfigureUnsafeSSLContext(SSL_CTX* ctx) {SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);SSL_CTX_set_options(ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
}
Https::Https(string url)
{if (!Https::is_init){Https::Init();}this->ResponseCode = -1;this->is_ok = false;this->is_connect = false;if (url.find("https://", 0) == -1){std::cout << "链接格式不规范" << std::endl;return;}this->is_ok = true;int t1 = url.find("/", 8)-8;if (t1 <= -1)t1 = url.length() - 8;this->Host = url.substr(8, t1);this->Url = url;this->Url_ssl = this->Host;this->Url_ssl.append(":https");this->set_headers("");
}int Https::connect()
{this->is_connect = true;this->ctx = SSL_CTX_new(SSLv23_method());if (!ctx) {std::cerr << "Error creating SSL context\n";ERR_print_errors_fp(stderr);return 1;}// 配置不安全上下文(不验证证书)ConfigureUnsafeSSLContext(ctx);// 创建BIO连接this->bio = BIO_new_ssl_connect(ctx);if (!bio) {std::cerr << "Error creating BIO\n";SSL_CTX_free(ctx);return 1;}// 设置主机和端口BIO_set_conn_hostname(bio,this->Url_ssl.c_str());// 获取SSL指针SSL* ssl = nullptr;BIO_get_ssl(bio, &ssl);SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);// 建立连接if (BIO_do_connect(bio) <= 0) {std::cerr << "Error connecting\n";ERR_print_errors_fp(stderr);BIO_free_all(bio);SSL_CTX_free(ctx);return 1;}// 发送HTTP请求if (BIO_write(bio, request.c_str(), request.length()) <= 0) {std::cerr << "Error writing request\n";ERR_print_errors_fp(stderr);BIO_free_all(bio);SSL_CTX_free(ctx);return 1;}// 读取响应char buffer[1];int bytesRead = 0;string h1="";while ((bytesRead = BIO_read(bio, buffer, sizeof(buffer)))){if (bytesRead < 0) {std::cerr << "Error reading response\n";break;}if (buffer[0] == '\r'){BIO_read(bio, buffer, sizeof(buffer));break;}h1.push_back(buffer[0]);}if (h1.find("HTTP/1.1 ") == -1)this->ResponseCode = 500;h1 = h1.substr(9, h1.find(" OK", 9));sscanf_s(h1.c_str(), "%d", &(this->ResponseCode));for (int i = 0; i < 1000; i++){h1 = "";BIO_read(bio, buffer, sizeof(buffer));if (buffer[0] == '\r'){BIO_read(bio, buffer, sizeof(buffer));break;}h1.push_back(buffer[0]);while ((bytesRead = BIO_read(bio, buffer, sizeof(buffer)))){if (bytesRead < 0) {std::cerr << "Error reading response\n";break;}if (buffer[0] == '\r'){BIO_read(bio, buffer, sizeof(buffer));break;}h1.push_back(buffer[0]);}int sp = h1.find(": ");if (sp == -1)break;string name = h1.substr(0, sp);int sp1= h1.find("\r",sp+2);if (sp1 == -1)sp1 = h1.length() - sp - 2;string value= h1.substr(sp+2, sp1);this->ResPons.insert(std::make_pair(name, value));name.clear();value.clear();}// 清理资源
}int Https::read(char * buffer, int len)
{int bytesRead = BIO_read(bio, buffer, len);return bytesRead;
}
int Https::getResponseCode()
{return this->ResponseCode;
}void Https::disconnect()
{if (!(this->is_connect))return;BIO_free_all(bio);SSL_CTX_free(ctx);EVP_cleanup();
}void Https::set_headers(string headers)
{this->request = "GET ";this->request += this->Url;this->request+=" HTTP/1.1\r\n";this->request += "Host: ";this->request += this->Host.c_str();this->request += "\r\n";this->request += headers;this->request += "\r\n";cout << request << endl;
}Https::~Https()
{this->disconnect();
}
//
//Head::Head(const char * name, const char * value)
//{
//	this->name = name;
//	this->value = value;
//}
//
//Head::Head(string lines)
//{
//	this->load_str(lines);
//}
//
//void Head::load_str(string lines)
//{
//	int sp = lines.find(": ");
//	if (sp == -1)
//		return;
//	this->name = lines.substr(0, sp);
//	int sp1= lines.find("\r",sp+2);
//	if (sp1 == -1)
//		sp1 = lines.length() - sp - 2;
//	this->value= lines.substr(sp+2, sp1);
//}
//1.cpp
#include"stdafx.h"
#include"https.h"int main() {Https *h = new Https("https://www.baidu.com/");h->connect();std::cout << h->getResponseCode() << std::endl;for (auto it = h->ResPons.begin(); it != h->ResPons.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}char t[1024];int len1;while ((len1 = h->read(t, 1024))>0){std::fwrite(t, 1, len1, stdout);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADI ADRV902x的射频模拟信号输入输出端口的巴伦匹配

根据规格书可知ADRV902x系列的&#xff1a; 【1】输入阻抗是100Ω差分&#xff0c;包括RX端口和ORX端口。 【2】输出阻抗是50Ω差分&#xff0c;包括TX端口。 而射频系统通常采用50Ω的单端走线&#xff0c;所以需要通过正确规格的巴伦完成差分转单端/单端转差分的处理。 巴…

【计算机视觉】OpenCV实战项目:Athlete-Pose-Detection 运动员姿态检测系统:基于OpenCV的实时运动分析技术

运动员姿态检测系统&#xff1a;基于OpenCV的实时运动分析技术 1. 项目概述1.1 技术背景1.2 项目特点 2. 技术架构与算法原理2.1 系统架构2.2 核心算法2.3 模型选择 3. 项目部署与运行指南3.1 环境准备硬件要求软件依赖 3.2 项目配置3.3 运行项目基本运行模式高级参数 4. 常见问…

linux perf top分析系统性能

1,看到内核宏是否支持perf功能 perf top -g 查看linux 内核宏定义 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 确保帧指针支持以捕获完整堆栈 2,使用perf top -g 报错 Access to performance monitoring and observability operations is l…

gin + es 实践 08

自动扩缩容 本文档详细介绍如何在Kubernetes环境中实现Go-ES应用的自动扩缩容&#xff0c;包括水平Pod自动扩缩容(HPA)、垂直Pod自动扩缩容(VPA)和集群自动扩缩容。 1. 自动扩缩容概述 自动扩缩容是指根据负载变化自动调整计算资源的过程&#xff0c;主要目标是&#xff1a;…

【比赛真题解析】混合可乐

这次给大家分享一道比赛题:混合可乐。 洛谷链接:U561549 混合可乐 【题目描述】 Jimmy 最近沉迷于可乐中无法自拔。 为了调配出他心目中最完美的可乐,Jimmy买来了三瓶不同品牌的可乐,然后立马喝掉了一些(他实在是忍不住了),所以 第一瓶可口可乐最大容量为 a 升,剩余 …

AI Coding的发展之路:从概念到改变世界的旅程

AI Coding的发展之路:从概念到改变世界的旅程 引言:当代码开始自己写代码 还记得第一次接触编程时的手足无措吗?那些复杂的语法规则、难以捉摸的逻辑错误,让多少人在深夜对着屏幕抓狂。而今天,一个全新的时代正在来临——AI开始帮我们写代码了。这不是科幻电影,而是正在…

基于DQN的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 最终效果&#xff1a; 以下所有内容&#xff0c;都是对上面DQN代码的改进&#…

Spring 必会之微服务篇(2)

经过上一篇文章的介绍,应该对微服务有了基本的认识,以及为什么要用微服务和微服务要面临的挑战和对应的解决问题,这一期继续聊聊关于微服务的相关知识。 服务拆分 为什么拆 对于大多数的小型项目来说,一般是先采用单体架构,但是随着后面的用户规模变大,业务越来越复杂…

word换行符和段落标记

换行符&#xff1a;只换行不分段 作用&#xff1a;我们需要对它进行分段&#xff0c;但它是一个信息群组&#xff0c;我希望它们有同样的段落格式&#xff01; 快捷键&#xff1a;shiftenter 段落标记&#xff1a;分段 快捷键&#xff1a;enter 修改字体格式或段落格式 …

JSON|cJSON 介绍以及具体项目编写

一、JSON介绍 JSON&#xff08;JavaScript Object Notation 即JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。 JSON是一种数据交换格式.JSON独立于编程语言(你不必学习JavaScript).JSON表达数据的方式对通…

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B

【LLaMA-Factory】使用LoRa微调训练DeepSeek-R1-Distill-Qwen-7B 本地环境说明禁用开源驱动nouveau安装nvidia-smi安装Git环境安装Anaconda(conda)环境下载DeepSeek-R1-Distill-Qwen-7B模型安装LLaMA-Factory下载LLaMA-Factory安装LLaMA-Factory依赖修改环境变量安装deepspeedA…

初始图形学(7)

上一章完成了相机类的实现&#xff0c;对之前所学的内容进行了封装与整理&#xff0c;现在要学习新的内容。 抗锯齿 我们放大之前渲染的图片&#xff0c;往往会发现我们渲染的图像边缘有尖锐的"阶梯"性质。这种阶梯状被称为"锯齿"。当真实的相机拍照时&a…

vllm笔记

目录 vllm简介vllm解决了哪些问题&#xff1f;1. **瓶颈&#xff1a;KV 缓存内存管理低效**2. **瓶颈&#xff1a;并行采样和束搜索中的内存冗余**3. **瓶颈&#xff1a;批处理请求中的内存碎片化** 快速开始安装vllm开始使用离线推理启动 vLLM 服务器 支持的模型文本语言模型生…

访问网站提示“不安全”“有风险”怎么办?

访问网站提示“不安全”“有风险”有以下几种解决方案 一、理解警告类型 1.“不安全”提示&#xff08;HTTP网站&#xff09; 原因&#xff1a;网站未使用HTTPS加密&#xff0c;传输数据&#xff08;如密码、支付信息&#xff09;可能被窃取。 表现&#xff1a;浏览器地址栏显…

vue3的响应式设计原理

Vue 3 的响应式设计是其核心特性之一&#xff0c;依赖于 Proxy 和 依赖收集机制&#xff0c;相比 Vue 2 的 Object.defineProperty&#xff0c;Vue 3 的响应式系统更加高效、灵活且易于维护。 以下是 Vue 3 响应式设计的核心原理&#xff1a; 一、核心机制概览 使用 Proxy 实现…

C++模板笔记

Cpp模板笔记 文章目录 Cpp模板笔记1. 为什么要定义模板2. 模板的定义2.1 函数模板2.1.1 函数模板的重载2.1.2 头文件与实现文件形式&#xff08;重要&#xff09;2.1.3 模板的特化2.1.4 模板的参数类型2.1.5 成员函数模板2.1.6 使用模板的规则 2.2 类模板2.3 可变参数模板 模板…

递归函数(斐波那契数列0,1,1,2,3,5,8,13,21,34,55...)

目录 一、斐波那契数列&#xff08;兔子问题&#xff09; 二、迭代法&#xff08;用while循环推下一项 ) 三、递归函数 (函数的定义中调用函数自身的一种函数定义方式) 四、递归函数的底层逻辑推理 (二叉树推倒最左下节点回退法) 一、斐波那契数列&#xff08;兔子问题&…

光的本质(以暗物质维度粒子为介质的能量传导)

一、光的概要描述 1、光的本质是能量传导 空间中均匀分布着暗物质维度粒子。光不是粒子也不是波,而是没有质量和形态的能量,在临近暗物质粒子之间的一种能量传递。 2、光能传递类似牛顿钟摆(空间中的牛顿钟摆) 当光能能量骚动一个暗物质粒子后,该暗物质粒…

Open CASCADE学习|管道壳体生成

一、引言 在计算机辅助设计&#xff08;CAD&#xff09;和计算机图形学领域&#xff0c;OpenCASCADE 是一款功能强大的开源 3D 建模库。它提供了丰富的几何和拓扑建模工具&#xff0c;其中管道壳体&#xff08;Pipe Shell&#xff09;生成是其重要功能之一。管道壳体广泛应用于…

JS正则表达式介绍(JavaScript正则表达式)

文章目录 JavaScript正则表达式完全指南正则表达式基础元字符与特殊字符基本元字符. - 点号\d - 数字\D - 非数字\w - 单词字符\W - 非单词字符\s - 空白字符\S - 非空白字符 正则表达式标志常用标志详解g - 全局匹配i - 忽略大小写m - 多行匹配s - 点号匹配所有字符u - Unicod…