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
};
时间: 05-03

st_vio——进程间通信接口抽象结构体的相关文章

换个语言学一下 Golang (9)——结构体和接口

基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数据类型.闲话不多说,看例子: type Rect struct { width float64 length float64 } 上面我们定义了一个矩形结构体,首先是关键是type表示要定义一个新的数据类型了,然后是新的数据类型名称R

介绍C#结构体与类区别

1. 结构体与类定义方式 结构体定义使用struct类定义使用class 结构体: struct testDemo{ int num; void action(){ } } 类: class testDemo{ int num; void action(){ } } ================== 2. 结构体与类的成员初始化 结构体成员变量在声明时不能赋值,而类在声明变量时会自动写入构造函数完成赋值(即只能定义,不能执行). 结构体中隐式构造函数存在,不能手动写,其余构造函数在手动编写中

XAudio2学习之音效相关结构体

任何XAudio2 voice都可以持有一个音频效果链.你可以使用XAUDIO2_EFFECT_DESCRIPTOR数组来指定效果链.每个描述因子都包含了由客户端提供的指向音效对象的指针.这些对象必须实现APO接口. 结构体定义为: typedef struct XAUDIO2_EFFECT_DESCRIPTOR { IUnknown *pEffect; BOOL InitialState; UINT32 OutputChannels; } XAUDIO2_EFFECT_DESCRIPTOR;

Swift 的 结构体

Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实现文件和接口. 结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口. 结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的. 语法 我们通过关键字 struct 来定义结构体: struct nameStruct { Definition 1 Definition 2

Swift 结构体的使用

Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实现文件和接口. 结构体允许我们创建一个单一文件,且系统会自动生成面向其它代码的外部接口. 结构体总是通过被复制的方式在代码中传递,因此它的值是不可修改的. 语法 我们通过关键字 struct 来定义结构体: struct nameStruct { Definition 1 Definition 2

C#学习记录4——结构体,接口

1.结构体 对于C++语言来说,其实结构体和类几乎没有什么太大的区别.类能够实现的功能,使用结构体大部分也可以. 不过,在C#里面,我们把结构体看作是一种轻量的类的替代品.它和类一样有构造方法,属性,成员属性/数据,甚至是操作符.注意struct构造方法必须有传入参数. 当然struct也不是完全支持类的所有功能的. 首先,结构体无法进行继承.也就是说,结构体不想类那样灵活,代码也无法复用. 其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型.这两种类型的区别,可以查看C#学习记录3上

golang 结构体的嵌入类型和接口

结构体的嵌入类型 1.嵌入结构体1 package main import "fmt" type Person struct { name string } type Student struct { class int person Person         //定义person 类型为Person } func main(){ s := Student{1,Person{"xiaoming"}} fmt.Println("name :",

保存接口信息的两个结构体ifconf和ifreq

用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考. 首先先认识一下ifconf和ifreq: //ifconf通常是用来保存所有接口信息的 //if.h struct ifconf { int ifc_len; /* size of buffer */ union { char *ifcu_buf; /* input from

wifidog源码分析Lighttpd1.4.20源码分析之fdevent系统(1)---fdevents结构体和fdevent系统对外接口

前面讲了lighttpd的插件系统,这一篇将看一看lighttpd中的fdevent系统.fdevent系统主要是处理各种IO事件,在web服务器中,主要就是向socket写数据和从socket读数据.通常,web服务器是IO密集型程序,这就要求在数据的读写上,web服务器必须能够具有很好的性能,不会因为某个socket的阻塞而致使其他socket也被阻塞,否则会大大降低服务器的性能.因此,大部分的web服务器都采用非阻塞IO进行数据的读写.lighttpd通过fdevent系统,采用类似OO中