rpc框架纱线之源码解析——协议和传输

  

纱线协议头和传输源码分析

  
 <代码>这篇博客主要学习rpc框架纱线的协议头和传输的实现,能力有限,有些语句没有看懂,所以猜测了一部分。 
  

yar_header_t的实现

  

_yar_header的定义主要在yar_protocol.h和yar_protocol。c里面,下面介绍这两个文件里的源码。
借用网上的一幅图片,请求体包括yar_header + packager_name + yar_request_t这三个部分,返回类似。
下面主要介绍yar_header的部分。

  

皉pc框架纱线之源码解析——协议和传输"

  

?   

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;
  }
   
  <人力资源/>   <人力资源/>   

纱线传输源码分析

  
 <代码>关于纱线传输方面源码分析,还是先从下面的图开始吧。感谢作图的人,比我说的直观。 
  

皉pc框架纱线之源码解析——协议和传输"

  

传输层主要涉及到如下几个文件:
传输/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框架纱线之源码解析——协议和传输