openssl3.2 - 官方demo学习 - client-arg.c

文章目录

    • openssl3.2 - 官方demo学习 - client-arg.c
    • 笔记
    • client-arg.c
    • END

openssl3.2 - 官方demo学习 - client-arg.c

笔记

client-arg.c

/*! \file client-argc. *//*!
*   \noteadd _CRT_SECURE_NO_WARNINGS to VS2019 option
*//** Copyright 2013-2023 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the Apache License 2.0 (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#include <string.h>
#include <stdbool.h> // for false
#include <assert.h> // for assert()#include <openssl/err.h>
#include <openssl/ssl.h>#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")#include <openssl/applink.c> /*! for OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink *//*! client-arg.c 是个TLS客户端程序 */
int main(int argc, char** argv)
{FILE* fpFileOut = NULL;FILE* fpFileErr = NULL;BIO* sbio = NULL, * out = NULL;int len;char tmpbuf[1024];SSL_CTX* ctx;SSL_CONF_CTX* cctx;SSL* ssl;char** args = argv + 1;const char* connect_str = "localhost:4433";int nargs = argc - 1;int ret = EXIT_FAILURE;do {fpFileOut = fopen("prj_out.txt", "wb");assert(NULL != fpFileOut);fpFileErr = fopen("prj_log.log", "wb");assert(NULL != fpFileErr);ctx = SSL_CTX_new(TLS_client_method());cctx = SSL_CONF_CTX_new();SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CLIENT);SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);// 可以由外面给定TLS服务器ip/port, 这里用connect_str//while (*args && **args == '-') {//    int rv;//    /* Parse standard arguments *///    rv = SSL_CONF_cmd_argv(cctx, &nargs, &args);//    if (rv == -3) {//        fprintf(stderr, "Missing argument for %s\n", *args);//        goto end;//    }//    if (rv < 0) {//        fprintf(stderr, "Error in command %s\n", *args);//        ERR_print_errors_fp(stderr);//        goto end;//    }//    /* If rv > 0 we processed something so proceed to next arg *///    if (rv > 0)//        continue;//    /* Otherwise application specific argument processing *///    if (strcmp(*args, "-connect") == 0) {//        connect_str = args[1];//        if (connect_str == NULL) {//            fprintf(stderr, "Missing -connect argument\n");//            goto end;//        }//        args += 2;//        nargs -= 2;//        continue;//    } else {//        fprintf(stderr, "Unknown argument %s\n", *args);//        goto end;//    }//}if (!SSL_CONF_CTX_finish(cctx)) {fprintf(fpFileErr, "Finish error\n");ERR_print_errors_fp(fpFileErr);break;}/** We'd normally set some stuff like the verify paths and * mode here* because as things stand this will connect to * any server whose* certificate is signed by any CA.*//*! 从ssl上下文中来的bio */sbio = BIO_new_ssl_connect(ctx);BIO_get_ssl(sbio, &ssl);if (!ssl) {fprintf(fpFileErr, "Can't locate SSL pointer\n");break;}/* We might want to do other things with ssl here */BIO_set_conn_hostname(sbio, connect_str);/*! 从文件中来的bio * 为了适应非命令行程序, 将stdout, stderr换成自己的实际文件FILE**/out = BIO_new_fp(fpFileOut, BIO_NOCLOSE); /*!< OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink */if (BIO_do_connect(sbio) <= 0) {fprintf(fpFileErr, "Error connecting to server\n");ERR_print_errors_fp(fpFileErr);break;}/* Could examine ssl here to get connection info */BIO_puts(sbio, "GET / HTTP/1.0\n\n");for (;;) {len = BIO_read(sbio, tmpbuf, 1024);if (len <= 0)break;BIO_write(out, tmpbuf, len);}ret = EXIT_SUCCESS;} while (false);SSL_CONF_CTX_free(cctx); /*! 已经将ctx配置进了cctx, 所以不用释放ctx, 由cctx负责释放ctx *//*! 由BIO_new_xx()来的BIO*, 必须调用BIO_free来释放 */BIO_free_all(sbio); /*! 由ssl链接上下文来的bio*, 要调用BIO_free_all() */BIO_free(out); /*! 由文件来的bio*, 调用BIO_free() */if (NULL != fpFileOut){fclose(fpFileOut);fpFileOut = NULL;}if (NULL != fpFileErr){fclose(fpFileErr);fpFileErr = NULL;}printf("END\n");return ret;
}

END

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

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

相关文章

Pandas实战100例 | 案例 42: 数据过滤

案例 42: 数据过滤 知识点讲解 数据过滤是数据处理中的一个基本任务。在 Pandas 中&#xff0c;你可以使用布尔索引来过滤符合特定条件的数据行。 数据过滤: 通过结合条件表达式&#xff08;例如 df[A] > 2 和 df[B] < 5&#xff09;&#xff0c;可以创建一个布尔索引…

vue3 源码解析(4)— createApp 源码的实现

前言 本文是 vue3 源码分析系列的第四篇文章&#xff0c;在使用 vue3 时&#xff0c;我们需要使用 createApp 来创建一个应用实例&#xff0c;然后使用 mount 方法将应用挂载到某个DOM节点上。那么在调用 createApp 时&#xff0c;vue 再背后做了些什么事情呢&#xff1f;在这…

类和对象---C++

类和对象目录 类和对象1.封装1.1 封装的意义1.2 struct和class区别1.3 成员属性设置为私有1.3.1 联系---判断圆和点的位置关系 2.对象的初始化和清理2.1 构造函数和析构函数2.2 构造函数的分类及调用2.2.1无参构造函数调用2.2.2有参构造函数调用2.2.2.1括号法2.2.2.2显式法2.2.…

微信小程序快速入门02(含案例)

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、页面导航1.…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码&#xff0c;用于将软硬件环境初始化到一个合适的状态&#xff0c;为操作系统的加载和运行做准备&#xff08;其本身不是操作系统&#xff09; Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

一个无敌的 Python 文件系统监控库

在软件开发和系统管理领域&#xff0c;经常需要监控文件和目录的变化&#xff0c;以便在文件被创建、修改或删除时触发相应的操作。Python Watchdog是一个强大的Python库&#xff0c;它提供了简单而灵活的方式来监控文件系统的变化。本文将详细介绍Python Watchdog的用法和功能…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展&#xff0c;如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段&#xff0c;为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源&#xff0c;通过直观的图表、图像和交互界面&#x…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

C++力扣题目654--最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

【Spring Boot 3】【数据源】自定义JPA数据源

【Spring Boot 3】【数据源】自定义JPA数据源 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是…

使用DevEco Studio导入Har模块,提示“Module Check Failed”—鸿蒙开发已解决

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结总结心得:寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了导入Har模块,提示“Module Check Failed" 的问题。 使用DevEco Studio…

7、防写一个shell 命令解释器

1、代码部分 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_INPUT_LENGTH 100void parse_command(char *command) {// 用于存储解析后的命令和参数char cmd[MAX_INPUT_LENGTH];char args[MAX_INPUT_LENGTH];// 将输入的命令拷贝到…

微信商家转账到零钱,既能单笔又能批量,支持多商户管理

大家好&#xff0c;我是小悟 微信商家转账到零钱的功能大家应该都熟悉吧&#xff0c;为了满足商家向用户微信零钱转账的需求&#xff0c;微信支付推出【商家转账到零钱】服务&#xff0c;方便商户可以一次向单个或多个用户的微信零钱转账。 商家转账到零钱为商户提供了简便、…

计算机毕业设计----SSH高校科研管理系统平台

项目介绍 本项目包含超级管理员、管理员、教师三种角色&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,教师管理,管理员管理等功能。 管理员角色包含以下功能&#xff1a; 登录,专业参赛奖项管理,科技论文发表管理,出版专业著作管理,科研项目立项管理,科研项目结…

MySQL从0到1全教程【2】SQL语言的通用语法及分类

1 SQL语言的通用语法格式 无论是那种数据库的产品&#xff0c;SQL语法都是通用的。 SQL语句可以单行编写也可以多行编写&#xff0c;以分号结尾。SQL语句可以使用空格或者缩进的方式来增强语句的可读性&#xff0c;空格和缩进的数量没有限制。MySQL数据库的SQL语句是不区分大…

常常放生,与佛心更相契

弘一法师曾说&#xff1a;“世上最好的放生&#xff0c;就是放过自己。”天地与我并生&#xff0c;万物与我为一&#xff0c;每一个众生最宝贵的是自己的生命。而人自称万物之灵&#xff0c;就应当有爱护万物、保护万物的责任心&#xff0c;心中要有慈悲和恻隐之心&#xff0c;…

金蝶云星空和吉客云单据接口对接

金蝶云星空和吉客云单据接口对接 对接系统&#xff1a;吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求&#xff0c;重新定位、全新设计推出的换代产品&#xff0c;从业务数字化和组织数字化两个方向出发&#xff0c;以构建流程的闭环为依归…

什么是分治法算法思想?

一、问题 分治与递归就像⼀对孪⽣兄弟&#xff0c;在设计算法时经常是同时应⽤的&#xff0c;递归算法⽐较好理解&#xff0c;那么什么是分治法算法思想呢&#xff1f; 二、解答 分治法算法的设计思想就是将⼀个难以直接解决的⼤问题&#xff0c;分割成⼀些规模较⼩的相同问题…

高级JavaScript。如何用JavaScript手撸一个富文本编辑器?

要素过多建议收藏 - 富文本编辑 基本的技术就是在空白 HTML 文件中嵌入一个 iframe 。通过 designMode 属性&#xff0c;可以将这个空白文档变成可以编辑的&#xff0c;实际编辑的则是 <body> 元素 的 HTML 。 designMode 属性有两个可能的值&#xff1a; "…