Jump to Navigation

对实现了RUDP的enet库定制化改造

对实现了RUDP的enet库定制化改造

### enet库介绍
enet是使用C语言实现的、简洁的、基于UDP的网络开发库。
最重要的特性是实现了UDP包的可选的可靠性、有序性。

除些以外,还实现了透明压缩功能,降低传输网络负载等。

但为了保持库本身的简单、可移植、方便嵌入特性,忽略掉了认证,服务发现,加密等功能。

enet库文档:http://enet.bespin.org/index.html

### 我的定制需求
我需要使用其reliable部分代码,即接收包要按照发送包的顺序,并且不能有丢包。
但是我的包并非来自UDP socket,所有无法直接使用现有的原装代码。

### 定制思路
现有的RUDP实现,大都还处于socket层之上,也许更有前途的要基于任意transport层上。
也就是双层设计,分解为控制层和传输层。
rudcp rilable USER DATA control protocol layer
rudtp rilable USER DATA transport protocol layer

控制层就是实现了reliable的部分,包括包排序,丢包重传,以及类似TCP的窗口控制,流量控制功能。
而传输层则可以是任意包括UDP socket在内的实际数据包传输方式,像UDP socket,甚至是来自类似IM的消息层软件。

### 定制原则
尽量保持与现有api的一致。
尽量少改动现有代码。

### 定制实现
粗看了enet的代码,代码看上去很整洁,也比较简单。
从其中分离出来了几个重要函数,enet_socket_send, enet_socket_receive。
这是在protocol.c中直接调用的,实现的UDP socket的发送和接收功能。

如果要实现其他传输层的,应该首先从这两个函数入手。
一种方式是修改这两个函数,使其适用新的非socket的网络传输层。
另一种方式是采用占位函数指针的方式,让使用端在初始化enet库时,给出特定的send/recv函数。

看上去第一种方式可能更简单,实际却不一定。
这是由于如果直接在现有代码上改整个send/recv函数实现,
则可能要引入其他的开发库,添加头文件,修改编译参数与链接参数等。

本人偏向与使用第二种,不用大改现有的代码,在现有结构体中插入占位函数指针即可,更简单。
只需要修改protocol.c中调用enet_socket_send/enet_socket_receive函数的两个位置就好。
好在这两个函数调用位置很少,只有这一处,对代码的改动不大。

虽然这一步是这样,比较简单,但有可能的是新的传输层需要新的结构体项,
现在来说还没有很好的办法能够抽象出这些新的结构体项。
也许可以考虑采用xxxcontext机制,让用户填充透明context结构体项更好。

### 持续改进
目前只是改的能够使用,但代码粗糙,设计也不漂亮。
另外还有废代码,比如我这并用不到socket,但目前还会创建socket,监听socket。
希望能够做一个完善的分支出来,实现这种双层式设计。
还希望能够和创建者沟通交流,看这种模式能否进入到官方代码中。

除了这一块要改进之外,还有一个感觉可能要改进的地方,就是包压缩部分。
现在提供了到ENetHost级别的压缩,无法细化到针对ENetPeer,甚至ENetChannel级别。
只能用一些简单的独立包压缩算法,而不能像HTTP那样,整个使用流式压缩。

### enet事件循环使用总结
enet事件循环,与其他事件循环要求有所不同。
比如有些库事件循环主函数,可以设置等待(block)时间为0,能够达到最佳效果了。
而enet_host_service最好是block时间为10ms左右,这样的效率最好。
如果采用block时间为0的话,可能要每1ms就执行一次,非常耗CPU资源。

enet并没有提供线程安全功能,所有在多线程环境中,要考虑enet_host_service中回调函数执行的
多线程同步问题,防止出现程序崩溃。

### 改造示例
https://github.com/kitech/toxsh/tree/master/toxtun

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut