文章归档

zeroqp, make the server network programming sample and interesting.

zeroqp 是我这两天做的一个小东西。将传统的服务器网络编程转为服务化。zeroqp适合特定的场景,比如我自身的需求。所以zeroqp不是万能的。在其他更多的场合可能反而会令程序变得更加蹩脚。用自己的工具,解决自己的问题。好吧。我承认我又在意淫了。。。

zeroqp 主要有三个简单的API,zeroqp_open(), zeroq_ctl(), zeroqp_wait()

zeroqp_open() 会返回一个专用的描述符,但是并不是一个真正的文件句柄,自然不能用read() write()等系统调用去操作它。zeroqp_ctl() 函数用来向系统注册一个服务,或者删除一个服务。而只要 zeroqp_wait() 一旦执行,系统就会处于监听状态。zeroqp 会启动所有的服务并打开相应的端口,等待客户端进行链接。我们需要做的,仅仅是在zeroqp_wait()启动之前注册一些服务而已。

  1. int32_t zeroqp_ctl(int32_t zfd, int32_t op, struct zeroqp_service *zs);
  2. #define ZEROQP_CTL_ADD 0x01
  3. #define ZEROQP_CTL_DEL 0x02

服务是由结构提 struct zeroqp_service 装载的,在安装服务之前需要一些服务的基本信息,struct zeroqp_service 的结构如下,

  1. struct zeroqp_service {
  2.     int8_t inet_addr[INET_ADDRSTRLEN];
  3.     int32_t inet_port;
  4.     int8_t zqp_srv[ZQPS_NAMESTRLEN];
  5.     _srv_callback *zqp_cbfunc;
  6. }

inet_addr 字段,保存的是IP地址串,可以是IPv4也可以是IPv6,inet_port为该服务器上的某个端口,zqp_srv是需要注册的服务名字,是zeroqp_service的唯一标识。zqp_cbfunc是服务的回调函数。

zeroqp 所有的服务都是异步执行的,单线程,适合快速响应的需求,如IO密集型服务,不适合计算密集型的场景。不过大家可以改成自己的,分享一下就更好了。

举个简单的例子来描述一下zeroqp的用途:

某个公司有个客服部门,主要的工作就是向客户提供服务。至于提供什么服务,是由公司来决定的。比如客户需要维修电脑,会先打个电话给该公司的客服部门,该公司的客服部门接受到需求之后,先分析这个服务是不是我们可以提供的,如果可以,就转交到相应的人员去处理,如果不是,这个过程就结束了。

在这里,公司就是使用zeroqp的开发人员,你可以给你的server定制各种服务,接受服务请求是epoll来异步通知的。struct zeroqp_service 结构的作用是相当于告诉操作系统,我需要在某个IP地址和端口上打开一条热线电话。实际上tcp_listen()了一个监听端口。然后在这个端口上绑定各种定制的服务。

zeroqp 允许你在同一个IP地址和端口上安装不同的服务。

zeroqp 同样允许你在不同的IP地址和端口上安装相同的服务。

甚至,zeroqp 允许你在相同的IP地址和不同的端口上安装相同的服务。。。哈哈,混乱了吧。。。

其实我知道你只有一个IP,所以zeroqp就是说,让你在不同的端口安装不同的服务,每个端口有自己的服务队列,不同端口的服务之间是相互独立的,不受影响的。

_srv_callback *zqp_cbfunc; zqp_cbfunc是服务执行的回调函数,就是说如果某个客户端链接上来了,需要请求某个服务,就执行这个callback function()。zeroqp 会自动分析和提取客户端提供的各种参数,然后通过 _srv_callback 的入口 argc 和 argv 传入给 cbfunc。

_srv_callback(int32_t fd, int32_t argc, slice **argv);

比如说,我在server上安装了一个名为 sum 的服务,专门负责计算各个参数的和。然后客户端链接server,需要使用这种服务,client提供了三个参数 23,43,33,当server检测到有需求请求时,分析这个请求是哪个服务的然后转向执行相应的回调函数,也就是上面的_srv_callback实例对象。client提供的参数会通过字符串传入 _srv_callback 里。在这里 argc = 3, argv[0]->data = "23",argv[1]->data = "43",argv[2]->data = "33"

这个图是不是会容易理解点?

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>