纱线协议头和传输源码分析
<代码>这篇博客主要学习rpc框架纱线的协议头和传输的实现,能力有限,有些语句没有看懂,所以猜测了一部分。代码>
yar_header_t的实现
_yar_header的定义主要在yar_protocol.h和yar_protocol。c里面,下面介绍这两个文件里的源码。
借用网上的一幅图片,请求体包括yar_header + packager_name + yar_request_t这三个部分,返回类似。
下面主要介绍yar_header的部分。
?
yar_protocol.h
<人力资源/><代码>//定义yar_header_t这个结构体的内容,一共82个字节。 typedef struct _yar_header { unsigned int id;//4 无符号短版;//2 unsigned int magic_num;//4 unsigned int保留;//4 无符号字符提供者[32];//32 无符号字符标记[32];//32 unsigned int body_len;//4 }//下面是声明两个函数,稍后在c文件中说明具体方法 yar_header_t * php_yar_protocol_parse (char *有效载荷); 空白php_yar_protocol_render (yar_header_t *头,使用uint id, char *提供者,char *标记,使用uint body_len,使用uint保留); 代码>
yar_protocol.c
<人力资源/><代码>//这个函数的作用应该是给头指向的结构体赋值/* htonl函数介绍:将主机数转换成无符号长整型的网络字节顺序。 *本函数将一个32位的数从主机字节顺序转换成网络字节顺序。 */空白php_yar_protocol_render (yar_header_t *头,使用uint id, char *提供者,char *标记,使用uint body_len,使用uint保留)/* {{{*/{ 头→magic_num=htonl (YAR_PROTOCOL_MAGIC_NUM); 头→id=htonl (id); 头→body_len=htonl (body_len); 头→保留=htonl(保留); 如果(提供者){ memcpy(头→提供者、提供者strlen(提供者)); } 如果(令牌){ memcpy(头→令牌,令牌,strlen(令牌)); } 返回; }/*}}}*///这个函数是将有效载荷指向的字符串,转成头结构体对应的内容然后返回。 yar_header_t * php_yar_protocol_parse (char *有效负载)/* {{{*/{ yar_header_t *头=(yar_header_t *)有效载荷; 头→magic_num=ntohl(头→magic_num); 如果标题→magic_num !=YAR_PROTOCOL_MAGIC_NUM) { 头→magic_num=htonl(头→magic_num); 返回NULL; } 头→id=ntohl(头→id); 头→body_len=ntohl(头→body_len); 头→保留=ntohl(头→保留); 返回头; }/*}}}*/代码>
问:下面的这句我没有看明白,感觉直接返回就可以了。
<代码>如果(头→magic_num !=YAR_PROTOCOL_MAGIC_NUM) { 头→magic_num=htonl(头→magic_num); 返回NULL; } 代码><人力资源/> <人力资源/>
纱线传输源码分析
<代码>关于纱线传输方面源码分析,还是先从下面的图开始吧。感谢作图的人,比我说的直观。代码>
传输层主要涉及到如下几个文件:
传输/curl.c传输/套接字。c yar_transport.h yar_transport。c 4个文件。
yar_transport.h
<人力资源/>yar_transport。h主要定义两个函数和一些结构体。
<代码>//这个应该是传输方式的方法定义,后面会在旋度。c socket.c中实现下面的内容 typedef struct _yar_transport_interface { void *数据; int(*打开)(struct _yar_transport_interface *自我,zend_string *地址,长选项,char * *味精); int(*发送)(struct _yar_transport_interface *自我,struct _yar_request *请求,char * *味精); struct _yar_response * (* exec) (struct _yar_transport_interface *自我,struct _yar_request *请求); int (* setopt) (struct _yar_transport_interface *自我,长类型,void *价值,void *加法); int (* calldata) (struct _yar_transport_interface *自我,yar_call_data_t * calldata); 空白(*关闭)(struct _yar_transport_interface *自我); }yar_transport_interface_t; typedef struct _yar_transport { const char *名称; struct _yar_transport_interface * (* init) (); 空白(*摧毁)(yar_transport_interface_t *自我); yar_transport_multi_t *多; }yar_transport_t;//下面是并行调用时的结构体定义 typedef struct _yar_transport_multi_interface { void *数据; int(*添加)(struct _yar_transport_multi_interface *自我,yar_transport_interface_t * cp); int (* exec) (struct _yar_transport_multi_interface *自我,yar_concurrent_client_callback *回调); 空白(*关闭)(struct _yar_transport_multi_interface *自我); }yar_transport_multi_interface_t; typedef struct _yar_transport_multi { struct _yar_transport_multi_interface * (* init) (); }yar_transport_multi_t;//根据名称获得对应的传输方式,旋度/袜子 PHP_YAR_API const yar_transport_t * php_yar_transport_get (char *的名字,int nlen);//注册传输方式到yar_transports_list PHP_YAR_API int php_yar_transport_register (const yar_transport_t *运输);rpc框架纱线之源码解析——协议和传输