DC4C代码阅读(4)——注册节点:register node

来源:互联网 发布:通过ip查mac地址命令 编辑:程序博客网 时间:2024/04/25 10:22

app.c服务实现层

comm.c通信层

main.c主程序入口

proto.c协议定义

server.c通信管理层(调用comm.c

util.c工具


主要流程:

1、注册节点在main函数中把自己转换为守护进程,设置信号的处理函数,然后创建子进程,子进程提供具体的服务,而父进程则监视子进程,如果子进程退出了再创建一个子进程。

2、子进程初始化监听端口,创建套接字,开始监听。

3、子进程在循环中等待事件的发生

4、如果listen套接字有事件发生,表示有客户(计算节点或者用户节点)连接进来

5、如果是客户套接字产生了套接字

1)读事件:非阻塞的读取报文,如果接收报文完毕,就交给报文转换层处理。报文转换层解析出报文的类型,根据报文的类型调用相应的处理函数进行处理(这里还会细讲)。

2)写事件:非阻塞的发送报文,如果报文发送完毕,那么设置该套接字等待读事件

3)错误事件:一般的处理都是关闭客户套接字

6、在循环的最后一步是给客户发送心跳包

7、如果子进程接收到指定的信号或者父进程退出,那么就会退出循环,从而结束子进程

8、如果父进程接收到指定信号,杀死子进程之后退出


main函数:

通信管理层的处理:

1、父进程创建了子进程之后,子进程进入server函数

2、设置信号处理函数

3、设置日志文件

4、设置日志级别

5、创建epoll套接字

6、创建并初始化监听套接字

7、绑定并监听,然后把监听套接字添加到套接字集合中

8、创建一个客户套接字数组,用于存放客户的套接字

9、进入循环,开始监听事件的发生

10、如果是监听套接字的读事件,表示有客户连接进来,那么在套接字数组中找到一个空闲的位置,调用accpet函数,接收一个客户套接字,然后设置套接字为非阻塞,监听该套接字的读事件。

11、对于监听套接字其他类型的事件,都表示产生了错误,,退出进程

12、如果是客户套接字的读事件,那么开始异步读取报文,若报文读取完成,则进入报文转换层,解析报文,根报文的类型调用相应的处理函数

13、如果是客户套接字的写事件,开始异步发送数据,如果数据发送完毕,那么继续监听这个套接字的读事件

14、对于客户套接字的其他事件都表示出错,如果出错那么关闭该客户套接字

15、处理完成各个事件之后,开始对客户套接字发送心跳包(心跳包的作用是确定哪些客户还存活),如果对某个客户发送的心跳包次数超过了指定的次数都没有得到回应,那么表示该客户已经离线,可以把该客户套接字关闭


报文转换层的处理(解析报文之后会进入应用处理层/服务实现层):

一、proto_CommandLine处理命令行协议

二、proto处理普通的协议(报文长度+协议类型+其他数据)

1、解析协议类型

2WRQ——计算节点向registernode注册

1)记录当前时间戳

2)根据通信包中的系统名字、版本、位数、ip地址、端口等信息在已注册的节点列表中进行查找,如果该计算节点已经在列表中(即名字、版本、位数、ip地址、端口都相同),那么表示已经注册,否则就是还没有注册,那么分配一个节点,插入到列表中,完成注册,然后发送回应给计算节点。

3QWQ——查询空闲的计算节点

1)遍历所有的计算节点,查找所有没有被使用的节点

2)把找到的计算节点的信息发到通信回应包中,返回给用户节点

4WNQ——执行程序的通知

1)找到对应的计算节点

2)把正在执行的程序的一些信息写入该计算节点的信息节点中,表示这个节点将被占用(同时也方便查询)

3)然后找到最合适、最空闲的节点放在列表头部(方便下次查找空闲节点)

5HBQ——心跳包的请求

1)格式化一个回应对象,放到发送缓存中,发送给客户

6HBP——心跳包的回应

1)设置心跳包的丢失数量为0






0 0
原创粉丝点击