工作忙,学习忙,但还是得随便写点。
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 };
时间: 2024-10-09 22:07:01