前端接入层主要的做什么呢?
主要是数据包的有效性验证和维持与玩家的长连接。
如何做有效性的验证,我们使用过和前端具体的协议定制。然后通过我们具体的协议包头+包体的来计算。
如果我们的计算和我们协议不一致,直接就断开和客户端的连接,发送rst信号,客户端会被通知到,进程会hub状态,
在这里,我们这个数据包分析是可以通过数据type来进行调用具体的数据分析函数,如果是我们的tcp设计的协议,就会走auth回调函数,如果是http,那么就走parshttp协议。等
那我们如何维持长连接。
当前端接入,我们会对每个accept后的操作符进行分配一段内存,保持连接,等到这个操作符上有数据,就会通过具体的内存来进行一些操作了。
如果该操作符有错误,那么我们就会通过epoll_clt 来进行删除该操作符,然后同时删除该段内存。
具体的 epoll代码实现我就不再详细输了,基本模式都是epoll_create,初始化后,我们在不停循环下,使用epoll_wait,监听事件,进行从数据操作符上读取数据,然后分析,和我们的业务进程进行通信。
而其他业务进程, 也会不停的从消息队列里去数据。 这样,我们就实现了 网络模块和业务模块的有效分离。使得我们的业务在单进程单线程下哦能每秒钟处理20万个数据包。
目前我们外网玩家压力测试能达到4000多人,cpu在80%了。
在网络模块,我们需要深刻理解socket下的一些很多细节,不如我们发送数据是否全部从发送缓冲区发送出去等,要发送什么信号给接入socket等等。需要很长时间一段时间积累才能理解到位。
本章节描述不是很深刻。我是主要负责改动,一本原型差不多没什么大问题了。