第七章 抽象IO / 7.2 数据结构

       BIO数据结构主要有2个,在crypto/bio.h中定义如下:

       1BIO_METHOD

              typedef struct bio_method_st

              {

                     int type;

                     const char *name;

                     int (*bwrite)(BIO *, const char *, int);

                     int (*bread)(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 *);

} BIO_METHOD;

该结构定义了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等函数来设置。

       2BIO

              truct bio_st

              {

       BIO_METHOD *method;

       /* bio, mode, argp, argi, argl, ret */

                     long (*callback)(struct bio_st *,int,const char *,int, long,long);

       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 */

       int references;

                     nsigned long num_read;

       unsigned long num_write;

CRYPTO_EX_DATA ex_data;

              }

              主要项含义:

init:具体句柄初始化标记,初始化后为1。比如文件BIO中,通过BIO_set_fp关联一个文件指针时,该标记则置1socket BIO中通过BIO_set_fd关联一个链接时设置该标记为1

shutdownBIO关闭标记,当该值不为0时,释放资源;改值可以通过控制函数来设置。

flags:有些BIO实现需要它来控制各个函数的行为。比如文件BIO默认该值为BIO_FLAGS_UPLINK,这时文件读操作调用UP_fread函数而不是调用fread函数。

retry_reason:重试原因,主要用在socketssl BIO 的异步阻塞。比如socket bio中,遇到WSAEWOULDBLOCK错误时,openssl告诉用户的操作需要重试。

num:该值因具体BIO而异,比如socket BIOnum用来存放链接字。

ptr:指针,具体bio有不同含义。比如文件BIO中它用来存放文件句柄;mem bio中它用来存放内存地址;connect bio中它用来存放BIO_CONNECT数据,accept bio中它用来存放BIO_ACCEPT数据。

next_bio:下一个BIO地址,BIO数据可以从一个BIO传送到另一个BIO,该值指明了下一个BIO的地址。

references:被引用数量。

num_readBIO中已读取的字节数。

num_writeBIO中已写入的字节数。

ex_data:用于存放额外数据。