openssl之BIO系列之17---连接(connect)类型BIO

Linux 实现OpenSSL 服务器端客户端通信 本博文是博主学习多位大佬的经验后记录的。 1.OpenSSL安装 详情参考博文:https://blog.youkuaiyun.com/qq_39521181/article/details/96457673 2.SSL 在学习openssl编程之前,先了解一下什么是SSL,有助于后续的学习。SSL 是一个缩写,代表的是 Secure Sockets Layer。它是支持在 Internet 上进行安... 阅读详情
    该类型的BIO封装了socket的Connect方法,它使得编程的时候可以使用统一的BIO规则进行socket的connect连接的操作和数据的发送接受,而不用关心具体平台的Socket的connect方法的区别。其相关定义的一些函数如下(openssl/bio.h):
     BIO_METHOD * BIO_s_connect(void);
     #define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
     #define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
     #define BIO_set_conn_ip(b,ip) BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
     #define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port)
     #define BIO_get_conn_hostname(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
     #define BIO_get_conn_port(b) BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
     #define BIO_get_conn_ip(b,ip) BIO_ptr_ctrl(b,BIO_C_SET_CONNECT,2)
     #define BIO_get_conn_int_port(b,port) BIO_int_ctrl(b,BIO_C_SET_CONNECT,3,port)
     #define BIO_set_nbio(b,n) BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)
     #define BIO_do_connect(b) BIO_do_handshake(b)
     BIO *BIO_new_connect(char *str)
    【BIO_s_connect】
    该函数返回一个connect类型的BIO_METHOD结构,该结构定义如下:
    static BIO_METHOD methods_connectp=
    {
     BIO_TYPE_CONNECT,
     "socket connect",
     conn_write,
     conn_read,
     conn_puts,
     NULL, /* connect_gets, */
     conn_ctrl,
     conn_new,
     conn_free,
     conn_callback_ctrl,
    };
    事实上,为了维护一个Socket结构,openssl里面还定义了一个BIO_CONNECT结构来维护底层socket的地址信息以及状态信息,不过,通过封装,我们一般是不用直接接触该结构的,在此也就不再多做介绍,感兴趣可以参看文件bss_conn.c里面的定义和函数。
    BIO_read和BIO_write的操作调用底层的连接的IO操作来完成。如果在服务器地址和端口设置正确,但连接没有建立的时候调用读写操作函数,那么会先进行连接的建立操作,然后再进行读写操作。
    BIO_puts操作是支持的,但是BIO_gets操作不支持,这在该类型BIO的BIO_METHOD结构定义中就可以看出来。
    如果关闭标志设置了,那么在BIO被释放的时候,任何活动的连接和socket都会被关闭。
    BIO_reset方法被调用的时候,连接(connect)类型的BIO的任何活动连接都会被关闭,从而回到可以重新跟同样的主机建立连接的状态。
    BIO_get_fd函数返回连接类型的BIO的底层socket,当参数c不是NULL的时候,就将该socket赋值给c,当然,socket也作为返回值。c参数应该为int*类型。如果BIO没有初始化,则返回-1。
    【BIO_set_conn_hostname】
    该函数使用字符串设置主机名,该主机名也可以为IP地址的形式,还可以包括端口号,如hostname:port,hostname/any/other/path和hostname:port/any/other/path也是可以的。返回1。
    【BIO_set_conn_port】
    该函数设置主机的端口号。该端口号的形式可以为数字的形式,也可以为字符串类似"http"的形式。如果使用字符串形式,首先会使用getservbyname函数搜索其相关的端口,如果没有搜索到,那么就会使用一张缺省的名字端口解释表,目前该表列出的字符串有:http, telnet, socks, https, ssl, ftp, gopher 和 wais.返回1。
    需要注意的是:如果端口名已经作为主机名的一部分设置了,那么它就会覆盖BIO_set_conn_port函数设置的端口值。有的时候(如有些应用可能不希望用固定的端口连接)可能不方便,这时候可以通过检测输入主机名的字符串中的":"字符,报错或截取字符串来避免这种情况。
    【BIO_set_conn_ip】
    该函数使用二进制的模式设置IP地址。返回1。
    【BIO_set_conn_int_port】
    该函数以整数形式设置主机端口号,参数应该为int*的形式。返回1。
    【BIO_get_conn_hostname】
    该函数返回连接类型BIO的主机名,如果BIO以及初始化,但是没有设置主机名,那么返回NULL。返回值因为是一个内部指针,所有不能更改它的值。
    【BIO_get_conn_port】
    该函数返回字符串类型的端口信息。如果没有设置,就返回NULL。
    【BIO_get_conn_ip】
    该函数返回二进制形式的IP地址。如果没有设置,返回为全0。
    【BIO_get_conn_int_port】
    该函数返回整数形式的端口号,如果没有设置,则返回0。
    上述四个函数的返回值在连接操作完成之后会被更新。而在此之前,返回值都是应用程序自己设置的。
    【BIO_set_nbio】
    设置I/O的非阻塞标志。如果参数n为0,则I/O设置为阻塞模式;如果n为1,则I/O设置为非阻塞模式。缺省的模式是阻塞模式。应该在连接建立之前调用本函数,因为非阻塞模式的I/O是在连接过程中设置的。返回值恒为1。
    注意:
    如果是阻塞模式的I/O,执行IO操作时(如读写),如果返回负值,说明就产生了错误的情况,如果返回值是0,一般来说表明连接已经关闭。
    如果设置为非阻塞模式,那么发出重试的请求就是很正常的事情了。
    【BIO_do_connect】
    该函数进行给定BIO的连接操作,如果连接成功,返回1,否则返回0或负值。在非阻塞模式的时候,如果调用失败了,可以调用BIO_should_retry函数以决定是否需要重试。
    一般来说,应用程序不需要调用本函数,只有在希望将连接过程跟其它IO处理过程独立开来的时候,才需要调用本函数。
    在初始化连接的过程的时候,如果返回值失败的原因为BIO_RR_CONNECT,调用BIO_should_io_special返回值可能也为true。如果出现这种情况,说明连接过程被阻塞住了,应用程序应该使用正常的方法进行处理,直到底层的socket连接上了再重试。
    【BIO_new_connect】
    该函数创建并返回一个连接类型的BIO,其实,它调用了BIO_s_connect、BIO_new已经BIO_set_conn_hostname函数完成了整个操作。成功则返回一个BIO,否则返回NULL。
    【例子】
    这是一个连接到本地Web服务器的例子,返回一页的信息并把该信息复制到标准输出设备。
     BIO *cbio, *out;
     int len;
     char tmpbuf[1024];
     ERR_load_crypto_strings();
     cbio = BIO_new_connect("localhost:http");
     out = BIO_new_fp(stdout, BIO_NOCLOSE);
     if(BIO_do_connect(cbio) <= 0) {
     fprintf(stderr, "Error connecting to server/n");
     ERR_print_errors_fp(stderr);
     /* whatever ... */
     }
     BIO_puts(cbio, "GET / HTTP/1.0/n/n");
     for(;;) { 
     len = BIO_read(cbio, tmpbuf, 1024);
     if(len <= 0) break;
     BIO_write(out, tmpbuf, len);
     }
     BIO_free(cbio);

     BIO_free(out);


FW : http://blog.youkuaiyun.com/gdwzh/article/details/19217

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南 本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。 阅读详情

相关推荐

桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20)

桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20)

Molly 的博客 1万+

Openssl之BIO系列(3)

17.连接(connect)类型BIO 该类型的BIO封装了socket的Connect方法,它使得编程的时候可以使用统一的BIO规则进行socket的connect连接的操作和数据的发送接受,而不用关心具体平台的Socket的connect方法的区别。其相关定义的一些函数如下(openssl\bio.h): BIO_METHOD * BIO_s_connect(void); #defi

Live_Today的专栏 2787

从PSDK到ROS节点:实战GPS数据发布与CMake配置

本文详细介绍了如何从大疆PSDK获取GPS数据并封装为ROS节点的实战过程,包括PSDK编译、GPS数据订阅、ROS节点实现及CMake配置优化。通过具体代码示例和调试技巧,帮助开发者快速实现无人机传感器数据与ROS系统的集成,提升开发效率。

weixin_30843605的博客 457

openssl之BIO系列之4---BIO控制函数介绍

BIO控制函数介绍          BIO控制函数有许多,并且不同的BIO类型还有不同的控制函数,这里只简单介绍一些通用的BIO控制函数,至于某种类型BIO的特定控制函数,则参考后续的文件。     BIO的通用控制函数有以下几种,其声明如下(openssl/bio.h):      long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);

fryingpan的专栏 1332

09、Flutter FFI Dart Native API

本文介绍了 Dart Native API 的基本用法,解决了 Dart 与 C 异步通讯的问题

eieihihi的专栏 4397

Python逆向实战:突破PDD长连接抓包的技术解析

本文详细解析了如何通过Python逆向技术突破PDD长连接抓包的难点,包括分析PDD的网络机制、绕过SSL证书验证以及完整抓包实战流程。文章重点介绍了使用Frida和VAXposed工具解决长连接和SSL Pinning问题,并提供了Python代码示例和数据分析方案,帮助开发者高效抓取PDD数据。

weixin_28678151的博客 1222

使用 OpenSSL API 建立安全连接 - 双向认证

 一、概念: 1.什么是 SSL?   SSL 是一个缩写,全称是 Secure Sockets Layer。   它是支持在 Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中。   数据在离开您的计算机之前就已经被加密,然后只有到达它预定的目标后才被解密。   证书和密码学算法支持了这一切的运转,使用 OpenSSL,您将有机会切身体会它们。  

891

爬取微博热搜并分析情绪趋势:NLP + 可视化一体化实践

本文介绍了如何用Python构建微博热搜关键词爬取与情绪分析系统。通过requests库获取微博热搜数据,使用snownlp进行中文情绪分析(0-1评分),并借助pandas、matplotlib和seaborn实现数据可视化。文章提供了从环境配置、数据采集到情绪计算和趋势图绘制的完整代码示例,同时建议扩展思路包括评论分析、多维度情绪分类和舆情预警系统搭建。这套方法可以帮助快速洞察公众情绪变化,为舆情监测和市场研究提供数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 818

OpenSSL中文手册之BIO库详解

这一系文章参考了http://blog.youkuaiyun.com/xiaoting451292510/article/details/466495831 BIO 概述  其实包含了很多种接口,用通用的函数接口,主要控制在BIO_METHOD中的不同实现函数控制,包括6种filter型和8种source/sink型。   source/sink类型的BIO是数据源,例如,sokect BIO和文件BIO。

liao20081228的博客 4万+

实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)

导读 本文主要介绍使用OpenCV对扫描文本矫正的应用实例及详细实现步骤。 背景介绍 在使用打印机或扫描仪扫描文档时,由于摆放位置差异难免造成扫描文档的倾斜。本文将使用OpenCV将倾斜的文档矫正水平并去除黑边。 实现步骤 本文只针对包含大部分文字的文档做倾斜矫正,思路来源是大部分文字倾斜后同一行的也在同一条直线,通过拟合直线计算文本倾斜角度,然后旋转来实现文本倾斜矫正。 详细步骤: ①加载倾斜图像 ②灰度转换+腐蚀+膨胀 ③Canny边缘检测 + 霍夫线变换检测直线 ...

Color Space的博客 3399

医疗工具识别(手术器械计数):基于YOLOv8的智能手术器械管理系统

YOLOv8是Ultralytics公司于2023年推出的最新一代目标检测算法,相比前代YOLOv5,在精度和速度上都有显著提升。Anchor-free检测:不再使用预定义的anchor boxes,简化了检测流程更高效的骨干网络:采用CSPDarknet53作为特征提取网络多尺度特征融合:通过PANet结构实现更好的小目标检测损失函数优化:使用CIoU损失提高边界框回归精度YOLOv8提供了多种规模的模型(n/s/m/l/x),可根据实际需求在精度和速度之间进行权衡。

YOLO 480

openssl之BIO系列之10---BIO链的定位操作

BIO链的定位操作    ---根据openssl doc/crypto/bio/bio_find_type.pod翻译和自己的理解写成        (作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com之openssl专业论坛)        前面的一篇文章讲过BIO链的构造方法,这里讲的是在一个BIO链中,怎么查找一个特定的BIO

内网安全与OpenSSL专栏 1710

YOLO26涨点改进 | 全网独家复现、小目标检测改进篇 | TGRS 2025 | YOLO26引入MFAE-YOLO中的GFFP、FCPS 和 C3k2-FPEU创新点,涨点起飞,直接发论文

🔥本文给大家介绍在YOLO26中引入MFAE-YOLO中的 GFFP(全局特征融合处理)、FCPS(特征通道像素注意力) 和 C3k2-FPEU(特征池提取单元) 二次创新改进模块,能显著提升对小目标的检测性能。GFFP通过多尺度特征融合增强全局上下文感知能力,有效提升小目标在复杂背景下的可辨性;FCPS融合通道、像素和空间注意力机制,增强了模型对关键细节和小区域特征的关注,提升检测精度;C2F-FPEU利用多种池化方式挖掘细节特征,优化浅层特征表示能力。三者协同提升了YOLO26在小目标检测中的鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 305

openssl BIO

struct bio_method_st { int type; char *name; int (*bwrite) (BIO *, const char *, size_t, size_t *); int (*bwrite_old) (BIO *, const char *, int); int (*bread) (BIO *, char *, size_t, size_t *); int (*bread_old) (BIO *, char *, int);

jingshaoyou的博客 446

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

BIO socket -- Client (BIO_s_connect)

BIO_s_connect can be used as an client socket object, and has its private data struct BIO_CONNECT, which is stored in BIO.ptr.In the struct, a status value int BIO_CONNECT.state is introduced to rec

小宋的专栏 2231

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

openssl之BIO系列之24---SSL类型的BIO

SSL类型的BIO ---依据openssldoc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing,Mail:wzhah@263.net,公布于:http://openssl.126.com之 openssl专业论坛) 从名字就能够看出,这是一个很重要的BIO类型,它封装了openssl里面的ss...

weixin_30609287的博客 333

openssl之BIO系列之2---BIO结构和BIO相关文件介绍

BIO结构和BIO相关文件介绍(作者:DragonKing Mail:wzhah@263.net 发布于:http://gdwzh.126.com openssl专业论坛)BIO的结构定义和相关项解析如下:(包含在bio.h文件中,其主文件为bio_lib.c)typedef struct bio_st BIO;struct bio_st...

潇汀 2万+

openssl 使用非阻塞 bio

序 在项目中需要访问 https 加密的网页,为了保证并发性,需要用到非阻塞的 socket,搜索发现,这种使用场景的相关介绍不是很多,所以这里记录一下使用的过程。 在项目中,所使用的 ssl 库是老牌 sll 库 —— openssl。所使用的 io多路复用 技术是 epoll。 核心流程 整体流程与访问非加密网站类似,不同之处在于有一下几点: 在 socket 建立 t...

aohuiyao3478的博客 741

openssl https 单向认证连接成功示例

openssl https 单向认证连接成功示例 研究这个玩意也有几天的时间了,刚学C 因为不熟悉编译折腾了不少时间,终于弄通了,发个随笔给研究openssl https的同学一点提示吧。 环境: ================================...

banyuxuan7255的博客 419

两个基于openssl的https client例子

1、使用BIO接口 openssl源码里s_client也是采用BIO接口 代码来自http://www.ibm.com/developerworks/cn/linux/l-openssl.html源代码里缺少SSL_library_init()调用 #include "openssl/ssl.h" #include "openssl/bio.h" #include "openssl/err...

huang714的专栏 627

OPENSSL关键数据结构之一:SSL

     SSL作为OPENSSL一个关键数据结构一点都不过分,无论是在SSL初始化连接,还是在读写数据,SSL数据结构都起着重要作用。SSL这个数据结构将SSL协议复杂的连接过程都封装在内部,提供一个简单的接口让用户调用,就象调用WINSOCK的连接函数一样简单。掌握OPENSSL,了解SSL内部结构非常必要。     SSL的数据结构struct ssl_st    {    /* proto

w9521423的博客 1万+
上一篇: openssl之BIO系列之14---源类型的NULL型BIO
下一篇: openssl之BIO系列之16---BIO对(pair)类型BIO
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值