c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)

OpenSSL的下载和环境配置

请参考:openssl下载安装教程
步骤:官网下载->安装到选定目录->配置环境变量->打开命令窗口检查是否安装成功
注意:
打开命令窗口(快捷键win+r,在弹出窗口内输入cmd按回车),输入命令openssl version如果显示openssl版本则表示安装成功。
我出现的问题:明明安装上了却显示

B:>openssl version
‘openssl’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决方法:更改到lib目录,输入命令:

B:\OpenSSL-Win64\lib>openssl.exe

因为我的版本openssl.exe文件在lib目录下,可以在OpenSSL-Win64文件夹里直接搜索openssl.exe,就知道在哪个目录下了。
运行之后再输入openssl version就会显示版本,例:

B:\OpenSSL-Win64\bin>openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.1.0 14 Mar 2023)

出现版本信息代表安装成功。

visual studio项目环境配置

我使用visual studio2019版本,以下步骤仅供参考。
1.在属性页顶端右边,把平台改成x64(根据自己需要),点击右侧配置管理器按钮,将此项目的平台改成x64(根据自己需要)。
2.打开项目界面,在上方菜单栏选择项目->属性
3.在左侧选择VC++目录,选择包含目录,编辑,粘贴openssl的include目录的绝对路径。

例如:B:\OpenSSL-Win64\include

选择库目录,编辑,粘贴openssl的lib目录的绝对路径

例如:B:\OpenSSL-Win64\lib

4.选择左侧C/C++常规,选择附加包含目录,编辑,粘贴openssl的include目录的绝对路径。

例如:B:\OpenSSL-Win64\include

5.选择左侧链接器,选择下侧输入,选择右侧附加依赖项,编辑,写入libssl.lib,libcrypto.lib的路径。在lib目录中,打开自己下载的openssl文件夹看一下具体是哪个路径,不同版本可能不同,我使用的版本是 3.1.0 14

例如:
B:\OpenSSL-Win64\lib\libssl.lib
B:\OpenSSL-Win64\lib\libcrypto.lib

注意:编译器所有无法识别SSL…的问题都是环境没配置好,再仔细看一下上述步骤,都是一步步配置过的,亲测OK。

代码实现

思路

请添加图片描述

源码

#include<stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h> 
#include <openssl/ssl.h>
#pragma comment(lib, "Ws2_32.lib")
int main() {// 初始化 Winsock(windows套接字)/*WSADATA是windows API定义的一个结构,存储关于winsock实现的详细信息*/WSADATA wsaData;/*WSAStartup()这个函数用于初始化Winsock库,MAKEWORD(2, 2)相当于创建了一个对Winsock 2.2的版本请求,&wsaData用于将wsaData地址结构传入函数*/if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {/*WSAStartup返回了一个非0的值则代表初始化失败*/printf("WSAStartup failed\n");return 1;}printf("客户端Winsock初始化成功\n");printf("————————————————————\n");//创建客户端对象/*声明一个整型变量socket_fd用来存储套接字描述符*/int socket_fd;/*socket()函数用于创建一个新的套接字,AF_INET指定了地址族为ipv4,SOCK_STREAM指定了套接字类型为流式套接字,即TCP第三个参数,通常用来指定协议*/if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== 0){perror("socket failed");exit(EXIT_FAILURE);}/*声明一个结构体变量sock_addr,用于存储套接字地址信息(IPv4)*/struct sockaddr_in sock_addr;	sock_addr.sin_family = AF_INET; //使用ipv4地址族/*htons() 函数用于将主机字节顺序转换为网络字节顺序,确保在不同架构的计算机上,端口号的表示都是一致的。*/sock_addr.sin_port = htons(8080); //设置端口号为8080//设置网络ip/*调用inet_pton()函数将字符串形式的IP地址转换为网络字节序的二进制IP地址,并存储到sock_addr.sin_addr中*/if (inet_pton(AF_INET, "192.168.1.128", &sock_addr.sin_addr) <= 0) {/*inet_pton()函数返回值如果小于等于零,表示转换失败*/perror("inet_pton() failed");exit(EXIT_FAILURE);}printf("创建客户端对象成功,尝试连接服务器\n");printf("————————————————————\n");//连接服务器if ((connect(socket_fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) < 0)) {perror("connect failed\n");exit(EXIT_FAILURE);}printf("对服务器发起连接\n");//初始化openssl库//SSL库初始化SSL_library_init();//载入所有SSL算法SSLeay_add_ssl_algorithms();//载入所有SSL错误消息SSL_load_error_strings();//创建SSL会话环境//使用 TLS_client_method() 函数创建了一个 SSL 上下文结构(SSL_CTX)/*TLS_client_method()const SSL_METHOD *TLS_client_method(void);函数的返回值用于指定SSL/TSL连接使用的方法,这个方法指定了客户端如何与服务器端建立连接。通过调用该函数,获取一个用于SSL/TSL客户端的SSL_METHOD结构,这个结构被传递给SSL_CTX_new()函数,用于创建SSL_CTX上下文对象。SSL_CTX_new()SSL_CTX *SSL_CTX_new(const SSL_METHOD *method);根据指定的SSL/TLS方法创建一个SSL/TSL上下文对象,该上下文对象包含了SSL/TSL连接的所有配置信息,包括加密算法、证书、私钥等。若创建失败返回NULL。*/SSL_CTX* pctxSSL = SSL_CTX_new(TLS_client_method());if (pctxSSL == NULL) {printf("error ssl_ctx_new\n");return -1;}/*基于之前创建的 SSL 上下文(SSL_CTX),创建了一个 SSL 对象,该对象将使用指定的上下文对象来配置 SSL/TLS 连接*/SSL* psslSSL = SSL_new(pctxSSL);if (psslSSL == NULL) {printf("error ssl_new\n");}/*SSL_set_fd()函数用于将一个套接字文件描述符与SSL对象关联起来,从而使SSL对象可以在该套接字上进行SSL/TSL加密通信。*/SSL_set_fd(psslSSL, socket_fd);//使用之前创建的 SSL 结构(SSL),建立了 SSL 连接。/*SSL_connect()函数尝试与远程服务器建立安全连接。iErrorConnect表示连接的状态,如果连接失败返回值小于零。*/INT iErrorConnect = SSL_connect(psslSSL);if (iErrorConnect < 0) {//打印错误码printf("error SSL_connect,iErrorConnect=%d\n", iErrorConnect);//打印当前SSL连接所使用的加密算法/*SSL_get_cipher() 函数返回一个指向当前 SSL 连接所使用的加密算法字符串的指针。*/}/*SSL_get_cipher() 函数返回一个指向当前 SSL 连接所使用的加密算法字符串的指针。*/printf("SSL connection using:%s\n", SSL_get_cipher(psslSSL));//准备http请求char http[] = "GET /index.html HTTP/1.1\r\nHost: 192.168.10.124:8080\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\r\ntext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n";//通过SSL连接发送http get请求,发送成功则返回发送的字节数,否则返回一个负值表示发送失败/*SSL_write()函数用于在SSL连接上写入数据,将http中的数据写入到与psslSSL相关的SSL连接中* 返回值小于零表示写入失败*/INT iErroeWrite = SSL_write(psslSSL,http,strlen(http));if (iErroeWrite<0) {printf("error SSL_write\n");return -1;}char buf[2048] = {0};/**/INT iLength = 1;/*调用SSL_read函数从SSL连接中读取数据第一个参数:SSL连接对象第二个参数:指向接收缓冲区的指针第三个参数:缓冲区的大小函数返回读取到的字节数*/while ((iLength=SSL_read(psslSSL,buf, sizeof(buf)))>=1) {}printf("读取数据成功\n");printf("服务器端给出的回应是%s\n", buf);//关闭SSL连接SSL_shutdown(psslSSL);//释放SSL数据结构SSL_free(psslSSL);//释放SSL_CTX数据结构SSL_CTX_free(pctxSSL);//关闭套接字closesocket(socket_fd);WSACleanup();return 0;
}

参考链接

1.c语言https实现客户端
2.visual studio openssl环境配置
3.https协议详解

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

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

相关文章

ChatGPT解决hmm...something seems to have gone wrong.

ChatGPT解决hmm…something seems to have gone wrong. 这里是官方社区的一种workaround办法。仅仅只是mark一下。 我这边遇到的现象是&#xff0c;ChatGPT 3.5是正常的&#xff0c;但是使用ChatGPT 4就会频繁的出现这样的输出。而且恶心的是&#xff0c;即使是这种输出&…

(三)丶RabbitMQ的四种类型交换机

前言&#xff1a;四大交换机工作原理及实战应用 1.交换机的概念 交换机可以理解成具有路由表的路由程序&#xff0c;仅此而已。每个消息都有一个称为路由键&#xff08;routing key&#xff09;的属性&#xff0c;就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型&a…

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上&#xff0c;并实现数据互通访问 首先准备两个虚拟机&#xff0c;这里示例ip分别为&#xff1a; 192.168.200.10&#xff1b;192.168.200.20 修改主机名&#xff0c;一个是mysql1&#xff0c;一个是mysql2&#x…

vscode 运行 java 项目之解决“Build failed, do you want to continue”的问题

Visual Studio Code运行 java 起来似乎比 IDEA 更轻量、比 eclipse 更友好&#xff0c;是不可多得的现代编译法宝。 安装好官方推荐的 java 扩展包后&#xff0c;就可以运行 java 代码了。功能 比 code runner 强&#xff0c;支持 gradle、maven、普通java项目&#xff0c;运行…

[云原生] Prometheus之部署 Alertmanager 发送告警

一、Alertmanager 发送告警的介绍 Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件&#xff0c;前者仅负责定义告警规则生成告警通知&#xff0c; 具体的告警操作则由后者完成。 Alertmanager 负责处理由 Prometheus Serve…

力扣L12--- 125验证回文串(java版)-2024年3月15日

1.题目 2.知识点 注1&#xff1a;在 Java 中&#xff0c;toString() 方法用于将对象转换为字符串表示形式。对于数组对象&#xff0c;toString() 方法将返回数组的字符串表示形式&#xff0c;其中包含数组中每个元素的字符串表示形式&#xff0c;以逗号分隔&#xff0c;并且包…

Python基础入门 --- 1-2.字面量

文章目录 Python基础入门第一章&#xff1a;1.1 第一个python程序 第二章 &#xff1a;2.1 字面量2.2 常用的值类型2.3 字符串2.3.1 三种定义方式2.3.2 引号嵌套2.3.3 字符串拼接2.3.4 字符串格式化2.3.5 格式化的精度控制数字精度控制&#xff1a; 2.3.6 字符串格式化方式22.3…

CentOS7 部署 k8s

准备两台虚拟机192.168.152.129192.168.152.130更改主机名192.168.152.129&#xff1a;hostnamectl set-hostname k8s-masterhostnamectl192.168.152.130&#xff1a;hostnamectl set-hostname k8s-node1hostnamectl master节点配置 1.配置hosts 在两台节点上执行vim /etc/h…

金蝶云星空,怎么做BI数据可视化分析?

金蝶云星空是一个流程管理方面的软件&#xff0c;如果想要做BI数据可视化分析&#xff0c;还就需要一套BI方案&#xff0c;即一套奥威BI软件金蝶云星空BI方案。 奥威BI软件&#xff0c;负责提供平台和技术&#xff1b;金蝶云星空BI方案&#xff0c;则提供标准化的数据分析模型…

「HarmonyOS」下拉刷新组件使用详情

前言&#xff1a;在客户端开发过程中&#xff0c;经常会出现下拉刷新的功能&#xff0c;用于重新加载数据和加载更多数据&#xff0c;通过查找相关资料&#xff0c;查找到一个refresh下拉刷新的第三方库&#xff0c;今天主要介绍一下其中比较常用的RefreshLayout形式下拉刷新使…

K8S日志收集方案-EFK部署

EFK架构工作流程 部署说明 ECK (Elastic Cloud on Kubernetes)&#xff1a;2.7 Kubernetes&#xff1a;1.23.0 文件准备 crds.yaml 下载地址&#xff1a;https://download.elastic.co/downloads/eck/2.7.0/crds.yaml operator.yaml 下载地址&#xff1a;https://download.e…

性能出众的一区新算法|星鸦优化算法NOA原理及代码实现(Matlab)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文KAU将介绍一个2023年发表在1区期刊KBS上的优化算法——星鸦优化算法(Nutcracker Optimization Algorithm&#xff0c;NOA)[1] 该算法由Mohamed …

一直被模仿,从未被超越

德国威步以及卓越的创新能力&#xff0c;成为业内不断被模仿的对象。德国威步自1989年创立35年以来&#xff0c;一直坚定地在软件保护及授权管理领域努力耕耘并不断创新和改进&#xff0c;拥抱互联网及软件开发技术的革新&#xff0c;完美融入并发展&#xff0c;虽然被其他竞争…

Github 2024-03-15 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-15统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3非开发语言项目2PHP项目1C#项目1Rust项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476…

通过Rothko罗斯科绘画学习CSS盒子

本文章属于学习笔记&#xff0c;在https://www.freecodecamp.org/chinese/learn/2022/responsive-web-design/中练习 1、使用 padding 简写属性来增加两个元素之间的空间到。 .canvas {} .frame { padding:50px; }2、overflow 设置为 hidden - 将画布更改回其原始尺寸。overfl…

Discourse 分类图片

我们可以在 Discourse 上为分类添加图片。 进入分类编辑界面&#xff0c;然后选择 Image 标签。 在 Images 标签下&#xff0c;上传分类需要的图片。 图片大小 图片的大小是 Discourse 进行控制的&#xff0c;高度为 150 PX 像素。 如果上传的图片大于 150 px 的高度像素&…

开源堡垒机Jumpserver安装教程

前言:堡垒机的应用场景 公司内有若干台服务器,既有windows的也有linux的, 提供有ERP,OA,Web,报表等等各种服务,往往需要远程登录到服务器上去做运维,但如果给root或者administrator权限,很容易出现不知道谁操作了的问题.如果不同人设置不同账号,又账号过多,权限不足等等其他问题…

外包就干了2个月,技术退步明显....

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

文章目录 一、向量和矩阵的基本运算二、几何基元和变换1、几何基元(Geometric Primitives)2、几何变换(Geometric Transformations)1. 各种变换的关系2. 变换公式3. 2D变换的层次4. python实现 一、向量和矩阵的基本运算 【计算机视觉】二、图像形成&#xff1a;1、向量和矩阵…

echarts绘制 联系词(关键字)

<template><div><div>【关键词条】</div><div ref"target" class"w-full h-full" stylewidth:300px;height:300px></div></div> </template><script setup> import { ref, onMounted,watch } from …