openssl3.2 - 官方dmeo学习 - sconnect.c

文章目录

    • openssl3.2 - 官方dmeo学习 - sconnect.c
    • 概述
    • 笔记
    • END

openssl3.2 - 官方dmeo学习 - sconnect.c

概述

TLS客户端 - 使用根证书, 非阻塞, 向服务器要东西.

笔记

开始一个新demo学习时, 要从头配置包含路径, 麻烦. 直接拷贝上一个实现工程, 换掉实现.c方便一些.
换的新demo实现, 要加入库包含和头包含, 麻烦, 做一个公用头文件, 直接include方便一些.

/*!
\file my_openSSL_lib.h
*/#ifndef __MY_OPENSSL_LIB_H__
#define __MY_OPENSSL_LIB_H__#ifdef  _WIN32
#include <windows.h>
#endif /* #ifdef  _WIN32 */#pragma comment(lib, "libcrypto.lib")
#pragma comment(lib, "libssl.lib")#include <openssl/applink.c> /*! for OPENSSL_Uplink(00007FF8B7EF0FE8,08): no OPENSSL_Applink */#ifdef  _WIN32
#define MY_SLEEP(x) Sleep(x)
#else
#define MY_SLEEP(x) sleep(x)
#endif /* #ifdef  _WIN32 */#endif /* #ifndef __MY_OPENSSL_LIB_H__ */
/*!
\file sconnect.c
\brief TLS客户端 - 使用根证书, 非阻塞, 向服务器要东西.
*//** Copyright 1998-2020 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*//*-* A minimal program to do SSL to a passed host and port.* It is actually using non-blocking IO but in a very simple manner* sconnect host:port - it does a 'GET / HTTP/1.0'** cc -I../../include sconnect.c -L../.. -lssl -lcrypto*/
#include <stdio.h>
#include <stdlib.h>#ifdef __unix__
#include <unistd.h>
#endif#include <string.h>
#include <errno.h>
#include <openssl/err.h>
#include <openssl/ssl.h>#include "my_openSSL_lib.h"#define HOSTPORT "localhost:4433"
#define CAFILE "root.pem"int main(int argc, char *argv[])
{const char *hostport = HOSTPORT;const char *CAfile = CAFILE;const char *hostname;// char *cp;BIO *bio_out = NULL;char buf[1024 * 10], *p;SSL_CTX *ssl_ctx = NULL;SSL *ssl;BIO *bio_ssl;int i, len, off, ret = EXIT_FAILURE;if (argc > 1)hostport = argv[1];if (argc > 2)CAfile = argv[2];#ifdef WATT32dbug_init();sock_init();
#endifssl_ctx = SSL_CTX_new(TLS_client_method());/* Enable trust chain verification */SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL);SSL_CTX_load_verify_locations(ssl_ctx, CAfile, NULL);/* Lets make a SSL structure */ssl = SSL_new(ssl_ctx);SSL_set_connect_state(ssl);/* Use it inside an SSL BIO */bio_ssl = BIO_new(BIO_f_ssl());BIO_set_ssl(bio_ssl, ssl, BIO_CLOSE);/* Lets use a connect BIO under the SSL BIO */bio_out = BIO_new(BIO_s_connect());BIO_set_conn_hostname(bio_out, hostport);/* The BIO has parsed the host:port and even IPv6 literals in [] */hostname = BIO_get_conn_hostname(bio_out);if (!hostname || SSL_set1_host(ssl, hostname) <= 0)goto err;/*! https://www.openssl.org/docs/man1.1.1/man3/BIO_set_nbio.html* sets the non blocking I/O flag to n. If n is zero then blocking I/O is set. If n is 1 then non blocking I/O is set.*/BIO_set_nbio(bio_out, 1);bio_out = BIO_push(bio_ssl, bio_out); /*! append bio_out to bio_ssl, 返回的是链表头 *//*!此时的链表头还是bio_ssl, 返回的也是链表头此时 bio_out == bio_ssl, 指针地址是一样的.此时操作bio_out的效果, 先经过bio_sll, 再经过原始的bio_out, 达到一个数据流经过不同工序被分别处理的效果.*/p = "GET / HTTP/1.0\r\n\r\n";len = (int)strlen(p);off = 0;for (;;) {i = BIO_write(bio_out, &(p[off]), len);if (i <= 0) {/*! BIO_should_retry() 的充实次数为2, 如果第3次还是失败, 就返回false */if (BIO_should_retry(bio_out)) {fprintf(stderr, "write DELAY\n");MY_SLEEP(1);continue;} else {goto err;}}off += i;len -= i;if (len <= 0)break;}for (;;) {i = BIO_read(bio_out, buf, sizeof(buf));if (i == 0)break;if (i < 0) {if (BIO_should_retry(bio_out)) {fprintf(stderr, "read DELAY\n");MY_SLEEP(1);continue;}goto err;}fwrite(buf, 1, i, stdout);}ret = EXIT_SUCCESS;goto done;err:if (ERR_peek_error() == 0) { /* system call error */fprintf(stderr, "errno=%d ", errno);perror("error");} else {ERR_print_errors_fp(stderr);}done:BIO_free_all(bio_out); /*! 如果是一个链表头的bio, 用BIO_free_all()来释放 */SSL_CTX_free(ssl_ctx);return ret;
}

END

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

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

相关文章

(超详细)4-YOLOV5改进-添加ShuffleAttention注意力机制

1、在yolov5/models下面新建一个SE.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn.parameter import Parameterclass ShuffleAttention(nn.Module):def __…

C //练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换为字符串。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-12 练习 4-12 运用printd函数的设计思想编写一个递归版本的itoa函数&#xff0c;即通过递归调用把整数转换为字符串。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要…

【IOS】惯性导航详解(包含角度、加速度、修正方式的api分析)

参考文献 iPhone的惯性导航&#xff0c;基于步态。https://www.docin.com/p-811792664.html Inertial Odometry on Handheld Smartphones: https://arxiv.org/pdf/1703.00154.pdf 惯性导航项目相关代码&#xff1a;https://github.com/topics/inertial-navigation-systems use…

openssl3.2 - 官方dmeo学习 - 索引贴

文章目录 openssl3.2 - 官方dmeo学习 - 索引贴概述笔记工程的搭建和调试环境BIOBIO - client-arg.cBIO - client-conf.cBIO - saccept.cBIO - sconnect.cBIO - server-arg.cBIO - server-cmod.cBIO - server-conf.cBIO - 总结certsEND openssl3.2 - 官方dmeo学习 - 索引贴 概述…

长尾分布定义,举个物种长尾分布和词频长尾分布的例子。

问题描述&#xff1a;长尾分布定义&#xff0c;举个物种长尾分布和词频长尾分布的例子。 问题解答&#xff1a; 长尾分布是一种概率分布的类型&#xff0c;它描述的是一种极端事件或者稀有事件的发生概率。具体来说&#xff0c;长尾分布描述的是少量的类别占据了大部分的样本…

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

STM32(HAL库) CubeMX+Keil5 建立工程

STM32&#xff08;HAL库&#xff09; CubeMXKeil5 建立工程 目标选择 菜单栏 File 新建工程打开工程退出软件 Window 输出窗口的开启软件字体设置 Help 软件帮助文档检查软件更新管理MCU 已存在工程&#xff08;Existing Projects&#xff09; 最近打开过的工程(Recent Open…

2024年值得关注的10种自动化测试趋势

超级自动化测试这是利用人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;来自动化测试任务。超级自动化测试可以帮助减少手动测试的需求&#xff0c;提高测试的效率&#xff0c;并在开发生命周期的早期发现缺陷。 TestOps集成TestOps是将DevOps实践扩…

PyPDF2 3.0.0更新,一些函数被弃用,需要重新写

1.PdfFileWriter is deprecated and was removed in PyPDF2 3.0.0. Use PdfWriter instead. 这错误表明你正在使用的 PyPDF2 版本中已经移除了 PdfFileWriter&#xff0c;并在版本 3.0.0 中被替代为 PdfWriter。这是因为在 PyPDF2 的更新中&#xff0c;一些 API 被重新组织和更…

中霖教育:专业不对口,能考会计师吗?

学的不是会计专业&#xff0c;专业不对口&#xff0c;能不能考会计师? 从学历要求来看&#xff0c;考会计师并无硬性规定必须具备哪个专业的学历。所以只要符合报考条件&#xff0c;非会计专业的人也可以报考会计师。 除了基本条件外&#xff0c;报名参加中级会计考试的人员…

html学习之路:简述html文档头部 <meta> 的 http-equiv 属性

&#x1f9cb;当输入网址打开网页时&#xff0c;设置html头部meta的http-equiv属性&#xff0c;可以帮助浏览器更加精确和正常却的显示网页内容&#xff0c;比如设置网页多久自动刷新&#xff0c;设置网页在浏览器缓存中的时限&#xff0c;设置多少事件跳转到指定的网页地址&am…

leetcode-合并两个有序数组

88. 合并两个有序数组 题解&#xff1a; 这是一个经典的双指针问题&#xff0c;我们可以使用两个指针分别指向nums1和nums2的最后一个元素&#xff0c;然后比较两个指针所指向的元素大小&#xff0c;将较大的元素放入nums1的末尾&#xff0c;并将对应的指针向前移动一位。重复…

Redis系列-15.Redis的IO多路复用原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

[DM8] 达梦8配置兼容Oracle

查看版本信息 select *&#xff0c;id_code from v$version; 查询解释&#xff1a; DM Database Server 64 V8 1-1-190-21.03.12-136419-ENT 64 版本位数标识&#xff0c;64表示为64位版本&#xff0c;无64则表示为32位版本 V8 大版本号&#xff0c;目前主要是V7、V8 1-1-190…

智慧医院之定位导航解决方案

移动端LBS应用 通过绘制院方各楼栋各层平面图,利用无线/蓝牙技术可对终端进行实时定位,方便病人、家属等就医,提高就医体验,减少工作人员工作量,减少医患冲突,打造智慧医院。 移动端的LBS位置应用,可分为医院的室内地图展现、室内地图搜索、室内导航、室内定位、室内位…

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

KAFKA高级应用

kafka高级应用 一些kafka的基础使用以及说明请参考上一篇文章kafka的基础入门。这篇文章主要是写kafka的一些高级特性、存储结构以及原理。 1.kafka副本同步机制 高可用是很多分布式系统中必备的特征之一&#xff0c;Kafka的高可用是通过基于 leader-follower的多副本同步实…

Qt QComboBox组合框控件

文章目录 1 属性和方法1.1 文本1.2 图标1.3 插入和删除1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的组合框是集按钮和下拉列表体的控件&#xff0c;&#xff0c;它占用的屏幕空间很小&#xff0c;对应的类是QComboBox 1 属性和方法 QComboBox有很多属性&#xff0c;完整的…

Java编程避坑指南之关键字专题

1、Java常见关键字 1&#xff09;、48个关键字&#xff1a; abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、l…

C++入门【27-C++ 引用】

引用变量是一个别名&#xff0c;也就是说&#xff0c;它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量&#xff0c;就可以使用该引用名称或变量名称来指向变量。 C 引用 vs 指针 引用很容易与指针混淆&#xff0c;它们之间有三个主要的不同&#xff1a; 不存在…