(0)业务描述

来源:互联网 发布:新疆英吉沙小刀淘宝店 编辑:程序博客网 时间:2024/06/10 00:28

功能

服务器主要有两大功能:管理连接,传递信息。

管理连接

管理连接,因为连接的本质其实就是个描述符,在计算机里就是一个整型。为了知道连接上是否有通信信息的到来,系统内核已经提供给了我们能很好的管理方式,也就是常用的select/epoll描述符多路复用模型。当然这个模型只是知道哪些连接上面有通信信息的到来,并不能对到来的信息做管理和控制。
所以我们需要有在业务层面管理连接的方式,也就是根据连接所处的业务状态去进行处理。管理的连接的数据结构根据业务的不同去选择,比如树形结构、数组结构和链表结构等。但是处理模型终究只有一个,那就是状态机模型。每个连接都是在不同的业务状态之间进行迁移,所以针对每个连接都要有一个数据结构来记录这个连接的详细上下文信息。

传递信息

传递信息那就更简单了,首先要有一个存储连接信息到来的缓冲区,包括发送缓冲区和接收缓冲区。这个系统已经提供了,但是针对用户层的缓冲区还是需要自己来设计,最好是能够做到可控。接下来就是只要把信息进行整理发送给终端client或者路由给后端server就行了。

业务领域描述

由于操作系统没有把连接抽象成业务想要的形式,在业务层自己需要定义一个表示连接的抽象,用类Connection表示。
业务层面管理这个连接,需要有存储连接的容器,用ConnectionContainer表示。
管理连接上发生的事件需要管理连接的工具,可以对epoll和select工具进行抽象,用ConnectionController表示。
发生的事件需要进行抽象,用Event表示。

Connection

class Connection{    int fd; //描述符id    int state;    //TCP连接状态    time_t createTime;  //TCP连接创建时间(utc时间)    time_t lastAccessTime;  //TCP连接上次处理时间(utc时间)    struct sockaddr_in clientAddr;  //客户端地址    int recvPkgLen; //接收业务包的长度    int recvedBytes;    //已接收的字节数    char recvBuf[MAX_RECV_BUF_LEN]; //接收缓冲区    int sendingBytes;   //将要发送的字节数    char sendBuf[MAX_SEND_BUF_LEN]; //发送缓冲区};

ConnectionContainer

class {public:    virtual Connection* Get(int fd) = 0;//获取一个连接    virtual bool Set(int fd, const Connection& c) = 0;//设置一个连接    virtual bool Remove(int fd) = 0;//删除一个连接                                                                                                                                            };

Event

class{public:    int event;//连接事件:读,写,错误。    int fd;};

ConnectionController

class ConnectionController{public:    virtual bool Init()=0;//初始化管理器    virtual vector<Event> WaitEvents()=0;//获取产生事件的连接    virtual bool SetEvent(int fd, Event e)=0;//设置连接需要管理的事件    virtual bool RemoveEvent(int fd)=0;//删除需要管理的连接};

核心业务逻辑

本质上就是一个事件循环,针对描述符上发生的事件进行处理。

{    while(true){        vector<Event> events = controller.WaitEvents();        for(int i=0;i<events.size();++i){            if(events.events有错误事件){                //处理            }            else{                if(events.events有读事件){                    //处理                }                if(events.events有写事件){                    //处理                }            }        }    }}
原创粉丝点击