分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

连接(connect)类型BIO

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

(作者:DragonKing, Mail: wzhah@263.net ,发布于:httpgdwzh.126.com之openssl专业论坛)

该类型的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);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有