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

连接(connect)类型BIO

---依据openssl doc\crypto\bio_s_connect.pod翻译和自己的理解写成

(作者:DragonKing, Mail: [email protected] ,公布于:http://gdwzh.126.com之o

penssl专业论坛)

该类型的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,(c

har *)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,(c

har *)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操作来完毕。假设在server地址和

port设置正确,但连接没有建立的时候调用读写操作函数,那么会先进行连接的建立操

作,然后再进行读写操作。

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地址的形式。还能够包含port

号,如hostname:port,hostname/any/other/path和hostname:port/any/other/path也

是能够的。返回1。

【BIO_set_conn_port】

该函数设置主机的port号。

该port号的形式能够为数字的形式,也能够为字符串类

似"http"的形式。假设使用字符串形式,首先会使用getservbyname函数搜索其相关的端

口,假设没有搜索到。那么就会使用一张缺省的名字port解释表。眼下该表列出的字符

串有:http, telnet, socks, https, ssl, ftp, gopher 和 wais.返回1。

须要注意的是:假设port名已经作为主机名的一部分设置了。那么它就会覆盖BIO_

set_conn_port函数设置的port值。有的时候(如有些应用可能不希望用固定的port连接

)可能不方便,这时候能够通过检測输入主机名的字符串中的":"字符,报错或截取字符

串来避免这样的情况。

【BIO_set_conn_ip】

该函数使用二进制的模式设置IP地址。

返回1。

【BIO_set_conn_int_port】

该函数以整数形式设置主机port号,參数应该为int*的形式。返回1。

【BIO_get_conn_hostname】

该函数返回连接类型BIO的主机名,假设BIO以及初始化。可是没有设置主机名,那

么返回NULL。

返回值由于是一个内部指针。全部不能更改它的值。

【BIO_get_conn_port】

该函数返回字符串类型的port信息。

假设没有设置,就返回NULL。

【BIO_get_conn_ip】

该函数返回二进制形式的IP地址。假设没有设置,返回为全0。

【BIO_get_conn_int_port】

该函数返回整数形式的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。

【样例】

这是一个连接到本地Webserver的样例,返回一页的信息并把该信息拷贝到标准输出

设备。

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);

时间: 2024-08-05 17:00:59

openssl之BIO系列之17---连接(connect)类型BIO的相关文章

openssl之BIO系列之18---接受(accept)类型BIO

接受(accept)类型BIO ---依据openssl doc\crypto\bio_s_accept.pod翻译和自己的理解写成 (作者:DragonKing, Mail: [email protected] ,公布于:http://gdwzh.126.com之o penssl专业论坛) 接受(accept)类型的BIO跟连接(connect)类型BIO是相相应的,它封装了Socke t的accept方法及其相关的一些操作,使得可以对不同的平台使用同一的函数进行操作. 其定义的相关函数例如以

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

SSL类型的BIO ---依据openssl doc\crypto\bio_f_ssl.pod翻译和自己的理解写成 (作者:DragonKing, Mail: [email protected] ,公布于:http://openssl.126.com之 openssl专业论坛) 从名字就能够看出,这是一个很重要的BIO类型,它封装了openssl里面的ssl规则 和函数,相当于提供了一个使用SSL非常好的有效工具,一个非常好的助手.其定义(opens sl\bio.h,openssl\ssl.h

openssl之BIO系列之9---BIO对的创建和应用

BIO对的创建和应用 ---依据openssl doc/crypto/bio/bio_new_bio_pair.pod翻译和自己的理解写成 (作者:DragonKing Mail:[email protected] 公布于:http://gdwzh.126.com之open ssl专业论坛) BIO对是BIO中专门创建的一对缓存BIO.要创建BIO对.调用以下定义的函数(open ssl\bio.h): int BIO_new_bio_pair(BIO **bio1, size_t writeb

openssl之BIO系列之12---文件描写叙述符(fd)类型BIO

文件描写叙述符(fd)类型BIO ---依据openssl doc\crypto\bio_s_fd.pod翻译和自己的理解写成 (作者:DragonKing [email protected] 公布于:httpgdwzh.126.com之openssl专 业论坛) 文件描写叙述符类型BIO也是一个source/sink型的BIO,它定义了下面一些类型的函数( openssl\bio.h): BIO_METHOD * BIO_s_fd(void); #define BIO_set_fd(b,fd,

openssl之BIO系列之22---Cipher类型的BIO

Cipher类型BIO ---依据openssl doc\crypto\bio_f_cipher.pod翻译和自己的理解写成 (作者:DragonKing, Mail: [email protected] ,公布于:http://gdwzh.126.com之o penssl专业论坛) 该类型为过滤(filter)类型BIO.其定义例如以下(openssl\bio.h,openssl\evp.h) : BIO_METHOD * BIO_f_cipher(void); void BIO_set_ci

解读ASP.NET 5 &amp; MVC6系列(17):MVC中的其他新特性

原文:解读ASP.NET 5 & MVC6系列(17):MVC中的其他新特性 (GlobalImport全局导入功能) 默认新建立的MVC程序中,在Views目录下,新增加了一个_GlobalImport.cshtml文件和_ViewStart.cshtml平级,该文件的功能类似于之前Views目录下的web.config文件,之前我们在该文件中经常设置全局导入的命名空间,以避免在每个view文件中重复使用@using xx.xx语句.默认的示例如下: @using BookStore @usi

6.17 连接connection

part1 1.首先创建模型 (1)先创建抽象类AbstractConnectionModel,管理通用信息,这时里面还什么都没有. public class AbstractConnectionModel { } (2)再创建具体的类LineConnectionModel,继承自AbstractConnectionModel. public class LineConnectionModel extends AbstractConnectionModel { } (3)再就要创建对应于上面模型

asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

原文:asp.net core 系列 22 EF(连接字符串,连接复原,DbContext) 一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json.用户机密存储.其他配置源中. 下面示例演示appsettings.json 中存储的连接字符串,这样不管asp.net core在什么环境(Development.Staging .Production)

Java使用JDBC连接任意类型数据库(mysql oracle。。)

package cn.liz.test; import java.io.InputStream; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; import java.util.Properties; import org.junit.Test; public class JBDCtest { /** * 编写一个通用的方法, 在不修改源程序的情况下, 可以获取任何数据库的连接