这个目录下存放了skynet用到的c service的实现
databuffer.h
hashid.h
servie_gate.c
这3个文件时gate服务的实现 gate主要用于skynet与外部的tcp通讯 可以理解为将外部的tcp消息转换成skynet内部的消息
所以像master harbor服务这些都需要以来gate与外界通信
master = master + gate
harbor = harbor + gate
具体是说明见: http: blog.codingnow.com/2012/09/the_design_of_skynet.html
hashid 就是应用层连接到客户端的peer_fd
databuffer 保存了某个客户端fd对应的数据
skynet_master.c
skynet_harbor.c
用于实现skynet集群间的内部通讯 不同skynet节点间的通信 skynet需要建立n*n条tcp连接来实现内部节点的通信Harbor 间通过单向的 tcp 连接管道传输数据,完成不同的 skynet 节点间的数据交换。skynet 目前支持一个全局名字服务,可以把一个消息包发送到特定名字的服务上。这个服务不必存在于当前 skynet 节点中。这样,我们就需要一个机构能够同步这些全局名字。
为此,我实现了一个叫做 master 的服务。它的作用就是广播同步所有的全局名字,以及加入进来的 skynet 节点的地址。本质上,这些地址也是一种名字。同样可以用 key-value 的形式储存。即,每个 skynet 节点号对应一个字符串的地址。skynet的 master服务 master服务保存了key-value key就是skynet的handle value就handle对应的服务matser用于skynet不同节点间的同步我设计了一台 master 中心服务器用来同步机器信息。把每个 skynet 进程上用于和其他机器通讯的部件称为 Harbor 。每个 skynet 进程有一个 harbor id 为 1 到 255 (保留 0 给系统内部用)。在每个 skynet 进程启动时,向 master 机器汇报自己的 harbor id 。一旦冲突,则禁止连入。master 服务其实就是一个简单的内存 key-value 数据库。数字 key 对应的 value 正是 harbor 的通讯地址。另外,支持了拥有全局名字的服务,也依靠 master 机器同步。比如,你可以从某台 skynet 节点注册一个叫 DATABASE的服务节点,它只要将 DATABASE 和节点 id 的对应关系通知 master 机器,就可以依靠 master 机器同步给所有注册入网络的 skynet 节点。master 做的事情很简单,其实就是回应名字的查询,以及在更新名字后,同步给网络中所有的机器。skynet 节点,通过 master ,认识网络中所有其它 skynet 节点。它们相互一一建立单向通讯通道。也就是说,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 1 万条通讯通道。
skynet_multicast.c
用于skynet的多播
skynet_tunnel.c
设置转发地址 即设置 forward的目的地址而跨集群分组又如何做到呢?这里是在上层用 lua 来做了进一步的封装。首先,提供了一个简单的,用 C 编写的服务,叫做 tunnel 。它可以把发送给它的消息,无条件的转发到另一个 handle 上。这个转发 handle 可以是在不同 skynet 节点上的。
service_logger.c
skynet的日志服务
skynet_snlua.c
skunet_lua.h
lua 服务生成器lua服务的消息 先到 service_snlua,再分发到lua服务中 每个lua服务其实 是一个service_snlua + 实际的lua服务总和