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

这篇具有很好参考价值的文章主要介绍了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。

代码实现

思路

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

源码

#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协议详解文章来源地址https://www.toymoban.com/news/detail-853090.html

到了这里,关于c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • (二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)

    目录 前言 一、服务器的代码: 1、服务器的思路 2、具体服务器的代码示例 二、客户端的代码: 1、客户端的思路(和服务器类似) 2、具体客户端的代码示例 前言         要是想了解QWebSocket的详细知识,还得移步到上一篇文章: WebSocket 详解,以及用QWebSocket 实现服务端

    2024年01月20日
    浏览(9)
  • 基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

    基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

    摘  要 近年来,随着中国经济的迅猛发展,医疗技术水平也在不断提高,但由于人口数目巨大,导致医疗资源人均分配不足的情况依旧十分严峻。预约挂号一直是制约医疗机构服务质量提高的主要环节之一。在传统预约挂号方式下,繁琐的预约挂号流程和医疗信息不透明给就

    2024年02月13日
    浏览(9)
  • QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

    QT充当客户端模拟浏览器等第三方客户端对https进行双向验证

    在 ssl单向证书和双向证书校验测试及搭建流程 文章中,已经做了基于https的单向认证和双向认证,,, 在进行双向认证时,采用的是curl工具或浏览器充当客户端去验证。 此次采用QT提供的接口去开发客户端向服务器发送请求,来验证https的双向认证流程。 依然以 ssl单向证书

    2024年02月14日
    浏览(38)
  • opensssl BIO方式https客户端

    废话不多说,代码中使用了两种https客户端的实现方式。

    2024年01月19日
    浏览(14)
  • TCP/IP C 语言实现单个客户端和服务端 TCP 通信

     这是多线程服务端 这是单线程服务端  这是客户端  

    2024年02月21日
    浏览(7)
  • Linux系统编程,使用C语言实现简单的FTP(服务器/客户端)

    Linux系统编程,使用C语言实现简单的FTP(服务器/客户端)

    前言 跟着上官社长 陈哥花了一个月的时间终于把Linux系统编程学的差不多了,这一个月真的是头疼啊,各种bug,调的真心心累,不过好在问题都解决掉了,在此也感谢一下答疑老师,给我提供了很多的思路,本文章是对前段时间学习Linux,做一个小小的总结,才疏学浅,只学

    2024年02月12日
    浏览(9)
  • 网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    网络编程-Socket通信实现服务器与客户端互传文件(JAVA语言实现)

    在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换. 网络编程三要素:ip地址、端口、协议 ip地址: 每台计算机指定的一个标识符,127.0.0.1是回送地址,可以代表本机地址 ,一般用来测试使用 ipconfig:命令行中查看本机地址 ping ip地址:检查网络是

    2023年04月14日
    浏览(16)
  • 多进程并发TCP服务器模型(含客户端)(网络编程 C语言实现)

    摘要 :大家都知道不同pc间的通信需要用到套接字sockte来实现,但是服务器一次只能收到一个客户端发来的消息,所以为了能让服务器可以接收多个客户端的连接与消息的传递,我们就引入了多进程并发这样一个概念。听名字就可以知道--需要用到进程,当然也有多线程并发

    2024年02月17日
    浏览(43)
  • JAVA客户端导入证书来访问HTTPS的方法

    JAVA客户端导入证书来访问HTTPS的方法

    1、 java 把证书都放在了 D:jdks1.8jrelibsecurity 这个路径下的cacerts 文件里面。 我们进入jdk/bin这个路径,使用keytool工具。 2、 输入以下命令 keytool -import -aliias [证书名字] -keystore [cacerts路径] -file [证书地址] 即可。 如果是自己的网站可以从服务商那里下载,如果是别人的网站那

    2023年04月17日
    浏览(10)
  • ESP32 HTTPS客户端POST请求(跳过证书验证)

    ESP32 HTTPS客户端POST请求(跳过证书验证)

    本文例程为ESP32 HTTPS客户端POST请求 只有HTTPS请求部分,联网部分省略默。。。 乐鑫ESP-IDF API参考文档 函数 esp_http_client_init 结构体 constesp_http_client_config_t 此结构体用于配置HTTP/HTTPS参数 设置HTTP/HTTPS请求方法 此接口可以手动设置HTTP请求方式(可以覆盖配置结构体的设置) 设置

    2024年02月05日
    浏览(168)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包