opensssl BIO方式https客户端
废话不多说,代码中使用了两种https客户端的实现方式。
#include <windows.h>
#include <WinSock.h>#pragma comment(lib,"ws2_32.lib")
#include "../include/openssl\ssl.h"
#include "../include/openssl\err.h"#pragma comment ( lib, "../lib/libeay32.lib" )
#pragma comment ( lib, "../lib/ssleay32.lib" )#define HTTPS_PORT 443DWORD BIOSendRecvData(sockaddr_in stBaiduPassPortAddr,char * pSendData,int iSendSize,char * pRecvData,int iRecvSize)
{//ERR_load_crypto_strings();//ERR_load_SSL_strings();//OPENSSL_add_all_algorithms_noconf();//如果系统平台不支持自动进行随机数种子的设置,这里应该进行设置(seed PRNG)SSL_CTX * ctxClient = SSL_CTX_new(SSLv3_client_method());//通常应该在这里设置一些验证路径和模式等,因为这里没有设置,所以该例子可以跟使用任意CA签发证书的任意服务器建立连接BIO * stBio = BIO_new_ssl_connect(ctxClient);SSL * sslClient = FALSE;int iRet = BIO_get_ssl(stBio,&sslClient);if(sslClient == FALSE){fprintf(stderr,"Can't locate SSL pointer\n");//ERR_print_errors_fp(stderr);//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);return FALSE;}/* 不需要任何重试请求*/iRet = SSL_set_mode(sslClient,SSL_MODE_AUTO_RETRY);//这里你可以添加对SSL的其它一些设置char szBioConnectAddrFormat[] = "%s:%u";char szBioConnectAddr[64];int iLen = wsprintfA(szBioConnectAddr,szBioConnectAddrFormat,inet_ntoa(stBaiduPassPortAddr.sin_addr),HTTPS_PORT);iRet = BIO_set_conn_hostname(stBio,szBioConnectAddr); //"passport.baidu.com"//BIO * out=BIO_new_fp(stdout,BIO_NOCLOSE);if(BIO_do_handshake(stBio)<=0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);fprintf(stderr,"Error connecting to server\n");ERR_print_errors_fp(stderr);return FALSE;}X509 * stCert = SSL_get_peer_certificate(sslClient);char * strServerName = X509_NAME_oneline(X509_get_subject_name(stCert),0,0);OPENSSL_free(strServerName);strServerName = X509_NAME_oneline(X509_get_issuer_name(stCert),0,0);OPENSSL_free(strServerName);X509_free(stCert);iRet = BIO_write(stBio,pSendData,iSendSize);if (iRet <= 0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);return FALSE;}char * pRecvPtr = pRecvData;iRet = BIO_read(stBio,pRecvPtr,iRecvSize);if (iRet <= 0){//SSL_free(sslClient);SSL_CTX_free(ctxClient);BIO_free_all(stBio);return FALSE;}while(iRet == 1){pRecvPtr ++;iRet = BIO_read(stBio,pRecvPtr,iRecvSize);}if (iRet > 0){*(pRecvPtr + iRet) = 0;}BIO_free_all(stBio);SSL_CTX_free(ctxClient);//SSL_free(sslClient);//BIO_free(out);return TRUE;
}DWORD SendAndRecvHttpsPacket(sockaddr_in stBaiduPassPortAddr,char * pSendData,int iSendSize,char * pRecvData,int iRecvSize)
{SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (sockClient == INVALID_SOCKET){return FALSE;}int iRet = connect(sockClient,(sockaddr*)&stBaiduPassPortAddr,sizeof(sockaddr_in));if (iRet == INVALID_SOCKET){closesocket(sockClient);return FALSE;}SSL_CTX * pctxClient = SSL_CTX_new( SSLv23_client_method() );if (pctxClient == 0){iRet = GetLastError();closesocket(sockClient);return FALSE;}SSL * pSSLClient = SSL_new(pctxClient);if (pSSLClient == 0){closesocket(sockClient);return FALSE;}iRet = SSL_set_fd(pSSLClient,sockClient);if (iRet <= 0){iRet = GetLastError();closesocket(sockClient);return FALSE;}iRet = SSL_connect(pSSLClient);if (iRet <= 0){iRet = GetLastError();//return FALSE;}iRet = SSL_write(pSSLClient,pSendData,iSendSize);if (iRet <= 0){iRet = GetLastError();//return FALSE;}char * pRecvBuf = pRecvData;int iSize = iRecvSize;do{iRet = SSL_read(pSSLClient,pRecvBuf,1);if (iRet > 0){pRecvBuf ++;iSize --;}} while (iRet > 0);*pRecvBuf = 0;SSL_free(pSSLClient);SSL_CTX_free(pctxClient);closesocket(sockClient);return (pRecvBuf - pRecvData);
}/*
DWORD BIOServerSample()
{BIO *sbio, *bbio, *acpt, *out;int len;char tmpbuf[1024];SSL_CTX *ctx;SSL *ssl;ERR_load_crypto_strings();ERR_load_SSL_strings();OpenSSL_add_all_algorithms();//Might seed PRNG here ctx = SSL_CTX_new(SSLv23_server_method());if (!SSL_CTX_use_certificate_file(ctx,"server.pem",SSL_FILETYPE_PEM)|| !SSL_CTX_use_PrivateKey_file(ctx,"server.pem",SSL_FILETYPE_PEM)|| !SSL_CTX_check_private_key(ctx)) {fprintf(stderr, "Error setting up SSL_CTX\n");ERR_print_errors_fp(stderr);return 0;}//Might do other things here like setting verify locations and//DH and/or RSA temporary key callbacks// New SSL BIO setup as server sbio=BIO_new_ssl(ctx,0);BIO_get_ssl(sbio, &ssl);if(!ssl) {fprintf(stderr, "Can't locate SSL pointer\n");// whatever ... }// Don't want any retries SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);// Create the buffering BIO bbio = BIO_new(BIO_f_buffer());//Add to chain sbio = BIO_push(bbio, sbio);acpt=BIO_new_accept("433");// By doing this when a new connection is established// we automatically have sbio inserted into it. The// BIO chain is now 'swallowed' by the accept BIO and// will be freed when the accept BIO is freed.BIO_set_accept_bios(acpt,sbio);out = BIO_new_fp(stdout, BIO_NOCLOSE);// Setup accept BIO if(BIO_do_accept(acpt) <= 0) {fprintf(stderr, "Error setting up accept BIO\n");ERR_print_errors_fp(stderr);return 0;}// Now wait for incoming connection if(BIO_do_accept(acpt) <= 0) {fprintf(stderr, "Error in connection\n");ERR_print_errors_fp(stderr);return 0;}// We only want one connection so remove and free// accept BIO//sbio = BIO_pop(acpt);BIO_free_all(acpt);if(BIO_do_handshake(sbio) <= 0) {fprintf(stderr, "Error in SSL handshake\n");ERR_print_errors_fp(stderr);return 0;}BIO_puts(sbio, "HTTP/1.0 200 OK\r\nContent-type: text/plain\r\n\r\n");BIO_puts(sbio, "\r\nConnection Established\r\nRequest headers:\r\n");BIO_puts(sbio, "--------------------------------------------------\r\n");for(;;) {len = BIO_gets(sbio, tmpbuf, 1024);if(len <= 0) break;BIO_write(sbio, tmpbuf, len);BIO_write(out, tmpbuf, len);// Look for blank line signifying end of headersif((tmpbuf[0] == '\r') || (tmpbuf[0] == '\n')) break;}BIO_puts(sbio, "--------------------------------------------------\r\n");BIO_puts(sbio, "\r\n");// Since there is a buffering BIO present we had better flush it BIO_flush(sbio);BIO_free_all(sbio);return TRUE;
}
*/int __stdcall WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd ){WSAData wsa;int ret = WSAStartup(0x0202,&wsa);if (ret ){return FALSE;}SSL_library_init( ); SSL_load_error_strings( );OpenSSL_add_all_algorithms();char szdata[0x4000];for (int i =0;i < sizeof(szdata); i ++){szdata[i] = 'a';}szdata[0] = '/';szdata[1] = 0;hostent * lphost= gethostbyname("www.baidu.com");DWORD lpip = *(DWORD*)(lphost->h_addr_list);DWORD ip= *(DWORD*)lpip;sockaddr_in sa = {0};sa.sin_family = AF_INET;sa.sin_port = ntohs(443);sa.sin_addr.S_un.S_addr = ip;char szrecv[0x4000];ret=BIOSendRecvData(sa,szdata, lstrlenA(szdata),szrecv, sizeof(szdata));//ret=SendAndRecvHttpsPacket(sa,szdata,0x10000,szrecv,0x10000);// SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);// if (s == INVALID_SOCKET)// {// return FALSE;// }return TRUE;
}
相关文章:
opensssl BIO方式https客户端
废话不多说,代码中使用了两种https客户端的实现方式。 #include <windows.h> #include <WinSock.h>#pragma comment(lib,"ws2_32.lib") #include "../include/openssl\ssl.h" #include "../include/openssl\err.h"#pragm…...
JavaScript之判断是否整数、取余、取整、进制、位或、ES6
MENU 方法一方式二方式三方式四方式五结束语 方法一 使用取余运算符判断,利用任何整数都会被1整除的原理,即余数是0的特点,通过这个规则来判断是否是整数。 let isInteger (val) > val % 1 0;// true isInteger(5); // false isInteger(…...

【打造你自己的Shell:编写定制化命令行体验】
本节重点: 学习进程创建,fork/vfork 学习到进程等待 学习到进程程序替换, 微型shell,重新认识shell运行原理 学习到进程终止,认识$? 一、进程创建 1.1.fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程…...

PGSQL主键序列
PostgreSQL和 MySQL数据库还是有一定的区别。 下面了解一下 PGSQL的主键序列。 一、主键 1、系统自带主键序列 在 PostgreSQL 中,GENERATED BY DEFAULT 和 GENERATED ALWAYS 是用于定义自动生成的列(Generated Column)的选项。一般可作用…...

pg14.2迁移至KingbaseV8R6后部分表记录数为空
pg14.2迁移至KingbaseV8R6后部分表记录数为空 问题描述 kdts工具迁移详情里显示表数据已迁移成功,但是迁移后测试发现部份表记录数为空 分别查看源库和目标库表记录数 --源库 select count(*) from aaf_sys_param order by 1; 229条--目录库 select count(*) fr…...

【Spring 篇】深入解析SpringMVC的组件魅力
SpringMVC,这个名字在Java Web开发者的耳边仿佛是一首动听的旋律,携着轻盈的氛围,带给我们一种愉悦的编程体验。但是,当我们深入探寻这个框架时,它的魅力远不止表面的简单,它由许多组件构成,每个…...
HPsocket 在 C# 中的运用:一款优秀的 socket 通信框架
摘要:本文将为您详细介绍 HPsocket,一款适用于 win32 平台的 socket 通信框架。同时,我们还将探讨如何在 C# 项目中使用 HPsocket,实现网络通信功能。通过本文,您将深入了解 HPsocket 的特点、优势以及在 C# 中的实际应…...
黑豹程序员-MyBatisPlus封装SQL的where条件的对象 QueryWrapper
说明 我们使用MybatisPlus时,我们可以不直接通过SQL操作数据库,而使用面向对象的方式。 其中遇到一个问题,就是如何用面向对象的方式实现 SQL中的where条件拼接。 MybatisPlus很体贴,它提供了一个QueryWrapper,查询包…...

每日一题——LeetCode1252.奇数值单元格的数目
进阶:你可以设计一个时间复杂度为 O(n m indices.length) 且仅用 O(n m) 额外空间的算法来解决此问题吗? 方法一 直接模拟: 创建一个n x m的矩阵,初始化所有元素为0,对于indices中的每一对[ri,ci],将矩…...
C#学习笔记3-函数与单元测试
现在开始参考书籍变为:《C# 12 and .NET 8 – Modern Cross-Platform Development.Mark Price》 函数 Writing, Debugging, and Testing Functions 写函数Debug运行时 logging单元测试 写函数 一个有着 XML 注释的函数 这里直接举一个例子: Numbe…...
osg屏幕事件处理器和状态集操控器学习
1 osgViewer::WindowSizeHandler 该事件处理器提供了对窗体屏幕的控制,功能如下: 按住或再次键盘f键,则三维窗体在全屏和退出全屏之间切换; 按住键盘>键,则屏幕分辨率增加; 按住键盘<键,则屏幕分辨率减小; 2 osgGA::StateSetManipulator 该事件处理器是状态集操…...

中国泛娱乐出海视频字幕解决方案
随着企业泛娱乐出海越来越成为热门,自动加载视频字幕需求变得越来越普遍,这能够为用户观众提供更好的视频体验。此次九河云为客户带来了aws视频字幕解决方案,满足客户视频字幕生成、翻译及后续编辑等完整工作流的需求。 客户价值:…...

iOS原生应用屏幕适配完整流程
1. 已iPhone 11 布局为设计布局,其他机型已这个来适配 2.变量与控件对应关系 txtViewer: txtAccount txtpwd seg btnOk 3.适配方法实现: //iOS屏幕适配 -(vo...

【征服redis8】Redis的AOF持久化
Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使…...

【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列
作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 二分查找 LeetCode730. 统计不同回文子序列 给你一个字符串 s ,返回 s 中不同的非空回文子序列个数 。由于答案可能很大,请返回对 109 7 取余 的结果。 字符串的子序列可以经由…...

android 和 opencv 开发环境搭建
本文详细说明给android项目添加opencv库的详细步骤,并通过实现图片灰度化来查看配置是否成功。 下载OPENCV ANDROID SDK 到官网下载 打开 https://opencv.org/releases/ 选择android,下载完成后解压出下面的文件: 安装android sdk 和 ndk …...

elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增)
elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增) 1、初始化 RestClient 在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为 RestHighLevelClient 的类中,必须先完成这个对象的初始化,…...
tp6框架中Http类 请求的header、body参数传参 及post、file格式
引入Http类: 在需要使用的地方引入Http类: use think\facade\Http; GET请求示例:$response Http::get(https://example.com/api/resource); 设置Header参数: $headers [ Authorization > Bearer YourAccessToken, Conte…...
基于极限学习机的图像处理,基于ELM的图像分割,基于极限学习机的细胞分割
目录 背影 极限学习机 基于极限学习机的图像,基于ELM的图像分割 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:基于极限学习机的图像,基于ELM的图像分割(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88759192 背…...

ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术
ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术 ... 代码。这些script会根据模块名字查找模块对应的模块声明文件,并根据该 ... 的地址,注册时需提供模块名和模块重定位表的地址。加 ... 。这个表的表项是“模块名”到“模块重定位表地址”…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB,助力企业 AI 应用高效落地
NineData 的数据库 DevOps 解决方案已完成对百度智能云向量数据库 VectorDB 的全链路适配,成为国内首批提供 VectorDB 原生操作能力的服务商。此次合作聚焦 AI 开发核心场景,通过标准化 SQL 工作台与细粒度权限管控两大能力,助力企业安全高效…...

Java多线程从入门到精通
一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某…...
n8n:解锁自动化工作流的无限可能
在当今快节奏的数字时代,无论是企业还是个人,都渴望提高工作效率,减少重复性任务的繁琐操作。而 n8n,这个强大的开源自动化工具,就像一位智能的数字助手,悄然走进了许多人的工作和生活,成为提升…...