介绍一个linux下的网络服务器模型。
系统架构
将服务器程序分为两个服务器,即逻辑服务器和网络服务器(TcpServer)。逻辑服务器负责处理服务器需要处理的逻辑,而网络服务器仅处理网络的连接以及数据的收发。这两个服务程序是各自独立的,而不仅仅是属于不同进程。所以TcpServer的程序是可以直接应用于各个地方,而代码不需要改动。两个服务器之间,以共享内存或者管道等连接
Logic | Pipe | TcpServer |
TcpServer Main类的数据结构
Main类的主结构为一个大的数组,数组中存储着名为TcpInfo的结构。TcpInfo中存储着某个Tcp连接的SOKET,IP,端口,创建时间等,和一个用于存储来往数据的大buff数组。当客户端与TcpServer建立连接后,TcpServer将数组的下标作为数据收发的主键。
管道数据结构
管道实际是一个大的队列(可采用环形队列),不过这个队列的元素长度是不定长的。我们的每个队列元素,由以下成员组成:CodeHead,NetHead,实际数据。CodeHead中,存储长度信息,这样我们就能知道要操作的数据的长度,NetHead是网络数据信息,主要是TcpInfo数组下标。CodeHead和NetHead是定长的。
CodeHead |
NetHead |
数据 |
CodeHead |
NetHead |
数据 |
TcpServer中共有两个管道,一个是逻辑服务器到客户端,一个是客户端到逻辑服务器。管道要存储队列头和队列尾两个信息。以S2C为例来说,逻辑服务器向客户端发信息时,将数据追加在队列尾部,而Tcp服务器则从队列头开始,不断将数据取出,并发送出去。选用共享内存的方法实现管道,还是比较合适的,效率上比较高。