自从linux出现了epoll,windows的完成端口,网络编程好多年没有什么变化了。本文结合工作中遇到的问题,说说网络库的接口的一些思索。

1 背景

因为做的是fps类的网游的服务器,游戏里跑,跳,开枪等都是由客户端引擎同步函数实现,没有我什么事,所以主要的逻辑都很简单,一些活动,商城购买,聊天等逻辑,可以说没有什么难点,因为项目的周期比较长,一共有三套网络库在使用。。。有封装boost的,还有老同事自己封装的两套。自从linux出现了epoll,windows的完成端口,网络编程好多年没有什么变化了。这里主要讨论的是异步的网络编程。

2 我心目中的网络库的功能

2.1 通知上层网络事件:连接,断开,可读,可写。

基本的epoll已经实现了这些最基本的功能,简单的封装一下即可。 库会告诉上层目前可读啦,可写啦,可以接收连接啦,已经连上啦,但是不会帮上层去做这些事情,只是告诉你可以做了。

2.2 在2.1基础上,网络事件到来时,帮助我们做一些事情

例如可读写时,自动从系统读缓冲区把数据读好,或者把用户写缓存写入系统的写缓冲区,或者调用accept接受一个连接。

2.3 分包

我们知道在网络通信时,tcp是基于流的,分包只是我们逻辑上的把字节流分成若干部分。发送方发了两个包,有可能接收方1次收到了两个包,也有可能接收方分3次才把第一个包接受完,并接收了部分第2个包。一般我们都会在每个包的前两个字节里加上这个包的长度,这样接收方可以根据这个长度把收到的字节流区分成若干个包。 而逻辑层使用时,不应该处理这些,应该等网络层判断收到一个完整的包以后,再通知逻辑层去处理。 但是这样有个缺点,网络库就需要规定定义协议长度的规则,不过一般都是在包头加若干个字节定义长度。 例如我们手游项目用的是protobuf协议,但是也需要在头部加两个字节代表长度。

未完待续。。