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);
    int (*bputs) (BIO *, const char *);
    int (*bgets) (BIO *, char *, int);
    long (*ctrl) (BIO *, int, long, void *);
    int (*create) (BIO *);
    int (*destroy) (BIO *);
    long (*callback_ctrl) (BIO *, int, BIO_info_cb *);
};

该结构定义了IO操作的各种回调函数,根据需要,具体的bio类型必须实现其中的一种或多种回调函数,各项意义如下:
type:具体BIO类型;
name:具体BIO的名字;
bwrite:具体BIO写操作回调函数;
bread:具体BIO读操作回调函数;
bputs:具体BIO中写入字符串回调函数;
bgets:具体BIO中读取字符串函数;
ctrl:具体BIO的控制回调函数;
create:生成具体BIO回调函数;
destroy:销毁具体BIO回调函数;
callback_ctrl:具体BIO控制回调函数,与ctrl回调函数不一样,该函数可由调用者(而不是实现者)来实现,然后通过BIO_set_callback等函数来设置。

struct bio_st {
    const BIO_METHOD *method;
    /* bio, mode, argp, argi, argl, ret */
    BIO_callback_fn callback;
    BIO_callback_fn_ex callback_ex;
    char *cb_arg;               /* first argument for the callback */
    int init;
    int shutdown;
    int flags;                  /* extra storage */
    int retry_reason;
    int num;
    void *ptr;
    struct bio_st *next_bio;    /* used by filter BIOs */
    struct bio_st *prev_bio;    /* used by filter BIOs */
    CRYPTO_REF_COUNT references;
    uint64_t num_read;
    uint64_t num_write;
    CRYPTO_EX_DATA ex_data;
    CRYPTO_RWLOCK *lock;
};

主要项含义:
init:具体句柄初始化标记,初始化后为1。比如文件BIO中,通过BIO_set_fp关联一个文件指针时,该标记则置1;socket BIO中通过BIO_set_fd关联一个链接时设置该标记为1。
shutdown:BIO关闭标记,当该值不为0时,释放资源;改值可以通过控制函数来设置。
flags:有些BIO实现需要它来控制各个函数的行为。比如文件BIO默认该值为BIO_FLAGS_UPLINK,这时文件读操作调用UP_fread函数而不是调用fread函数。
retry_reason:重试原因,主要用在socket和ssl BIO 的异步阻塞。比如socket bio中,遇到WSAEWOULDBLOCK错误时,openssl告诉用户的操作需要重试。
num:该值因具体BIO而异,比如socket BIO中num用来存放链接字。
ptr:指针,具体bio有不同含义。比如文件BIO中它用来存放文件句柄;mem bio中它用来存放内存地址;connect bio中它用来存放BIO_CONNECT数据,accept bio中它用来存放BIO_ACCEPT数据。
next_bio:下一个BIO地址,BIO数据可以从一个BIO传送到另一个BIO,该值指明了下一个BIO的地址。
references:被引用数量。
num_read:BIO中已读取的字节数。
num_write:BIO中已写入的字节数。
ex_data:用于存放额外数据。

实例:

#include "/usr/include/openssl/opensslconf.h"
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
			
int     main()
{

       	BIO     *b=NULL;
      	int     len=0;
      	char    *out=NULL;

        b=BIO_new(BIO_s_mem());

	//都是写
	len=BIO_write(b,"openssl",4);
	len=BIO_printf(b,"%s","zcp");

	//得到缓冲区中待读取大小
	len=BIO_ctrl_pending(b);

	out=(char *)OPENSSL_malloc(len + 1);
	len=BIO_read(b,out,len);
	printf("len = %d\n", len);
	*(out + len) = '\0';

	printf("out = %s\n", out);
	
	printf("\n");

	OPENSSL_free(out);
	BIO_free(b);	
	return 0;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值