首页 > 代码库 > st_vio——进程间通信接口抽象结构体

st_vio——进程间通信接口抽象结构体

工作忙,学习忙,但还是得随便写点。

st_vio,顾名思义,应该是指virtual IO,即虚拟IO。根据代码里的注释,这个是一个高度抽象的进程间通信接口结构体,mysql中,如果不是用C++类来抽象,那么就是用含函数指针的结构体来抽象,这也是C语言最常用的习惯。

 

struct st_vio
{
my_socket    sd;    /* my_socket - real or imaginary套接字 */
HANDLE hPipe/* 看风格应该只用于Windows系统 */;
my_bool    localhost;    /* Are we from localhost? 这个网络接口是本地连接吗?? */
int    fcntl_mode;    /* Buffered fcntl(sd,F_GETFL) 缓存fcntl的flag */
struct sockaddr_storage    local;    /* Local internet address 连接本端地址 */
struct sockaddr_storage    remote;    /* Remote internet address 连接远端地址 */
int addrLen; /* Length of remote address 远端长度 */
enum enum_vio_type    type;    /* Type of connection 连接类型,包括连接是否关闭,tcpip连接,socket,管道,ssl连接,共享内存,从类型上看,应该是用来标志连接的通信方式的*/
char    desc[30];    /* String description 描述 */
char *read_buffer; /* buffer for vio_read_buff 读缓存 */
char *read_pos; /* start of unfetched data in the
read buffer 开始读数据的偏移 */
char *read_end; /* end of unfetched data 读结束位置 */
/* function pointers. They are similar for socket/SSL/whatever 以下就是这个结构体的对应“成员函数” */
void (*viodelete)(Vio*); /* free vio结构体内存 */
int (*vioerrno)(Vio*); /* 获得对应错误码 */
size_t (*read)(Vio*, uchar *, size_t); /**/
size_t (*write)(Vio*, const uchar *, size_t); /**/
int (*vioblocking)(Vio*, my_bool, my_bool *); /* 阻塞?还不知何用 */
my_bool (*is_blocking)(Vio*); /* 是否已经阻塞 */
int (*viokeepalive)(Vio*, my_bool);/* 保持alive,心跳用的吗? */

int (*fastsend)(Vio*);/* 快速发送 */

/* 以下基本可以望文生义 */

my_bool (*peer_addr)(Vio*, char *, uint16*, size_t); 
void (*in_addr)(Vio*, struct sockaddr_storage*);
my_bool (*should_retry)(Vio*);
my_bool (*was_interrupted)(Vio*);
int (*vioclose)(Vio*);
void    (*timeout)(Vio*, unsigned int which, unsigned int timeout);
my_bool (*poll_read)(Vio *vio, uint timeout);
my_bool (*is_connected)(Vio*);
my_bool (*has_data) (Vio*);
#ifdef HAVE_OPENSSL
void    *ssl_arg; /* ssl 参数*/
#endif
};

 

st_vio——进程间通信接口抽象结构体