enet udp 分析哪些游戏用了

随笔- 109&
&&&&&&&&&&&
大家都知道UDP这个东西太不可靠了,存在着乱序,丢包,包重复等缺点,但它的速度快,包有界等优点,但在实际编程中要自己处理乱序啊之类的问题会发疯的。也许大家说用TCP就得了,第一点TCP的速度比较慢,第二个TCP是一个数据流一样的东西,我们要传数据的话还得处理数据的分界问题,也挺麻烦的。&&& 针对这个问题,ENET这个库实现了一个性能介于TCP与UDP之间,完成可靠(不丢包,按序),保持数据的分界的优点。编程起来也挺方便的。下载到,目前最新版本是1.2,然后按照说明编译出库出来。&&& 使用ENET库就可以实际可靠的UDP编程,一个简单的例子如下:///////服务器#include&&iostream&#include&&enet/enet.h&using&namespace&void&main(){//初始化enet库if(enet_initialize()){&&&&&cout&&&"初始化失败"&&&&&&&&return;}//下面创建服务器ENetAddress&address.host=ENET_HOST_ANY;address.port=1234;ENetHost&*server=enet_host_create(&address,&//主机地址&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&64,&&&&&&&&//允许的连接数&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0);&&&&&&&&//自动管理带宽if(server==NULL){&&&&&cout&&&"创建主机对象失败"&&&&&&&&enet_deinitialize();&&&&return;}//下面开始收数据等ENetEvent&event;while(enet_host_service(server,&event,5000)&=0){&&&&if(event.type==ENET_EVENT_TYPE_CONNECT)&//有客户机连接成功&&&&&{&&&&&&static&unsigned&int&num=0;&&&&&&ENetAddress&remote=event.peer-&&//远程地址&&&&&&char&ip[256];&&&&&&enet_address_get_host_ip(&remote,ip,256);&&&&&&cout&&&"ip:"&&&ip&&&"&已经连接,序号:"&&&num&&&&&&&&&event.peer-&data=(void*)num++;&&&&}&&&&&else&if(event.type==ENET_EVENT_TYPE_RECEIVE)&//收到数据&&&&&{&&&&&&cout&&&"收到序号"&&&event.peer-&data&&&"的数据,从"&&&event.channelID&&&"通道发送"&&&&&&&&&cout&&&"数据大小:"&&&event.packet-&dataLength&&&&&&&&&cout&&&"数据:"&&&(char*)event.packet-&data&&&&&&&&&enet_packet_destroy(event.packet);&&&&//注意释放空间&&&&&&cout&&&&&&&&}&&&&&else&if(event.type==ENET_EVENT_TYPE_DISCONNECT)&//失去连接&&&&&{&&&&&&cout&&&"序号"&&&event.peer-&data&&&"远程已经关闭连接"&&&&&&&}}enet_deinitialize();}///////客户端#include&&iostream&#include&&enet/enet.h&using&namespace&void&main(){//初始化enet库if(enet_initialize()){&&&cout&&&"初始化失败"&&&&&&return;}//创建本地HOST对象ENetHost&*client=enet_host_create(NULL,&&&&&&&&&&&1,&&&//只允许连接一个服务器&&&&&&&&&&&0,&&&&&&&&&&&0);if(client==NULL){&&&cout&&&"创建客户端失败"&&&&&&return;}//连接到服务器ENetAddress&enet_address_set_host(&svraddr,"127.0.0.1");svraddr.port=1234;ENetPeer&*server=enet_host_connect(client,&svraddr,3);&//client连接到svraddr对象,共分配三个通道if(server==NULL){&&&cout&&&"连接服务器失败"&&&&&&return;}ENetEvent&event;//连接成功后必须调用enet_host_service来最终确认if&(enet_host_service&(client,&&event,&5000)&&&0&&&&&&&&&&&event.type&==&ENET_EVENT_TYPE_CONNECT)&&&&{&&&&&&&&cout&&&"连接服务器成功"&&&&&&&}&&&&else&&&&{&&&&&&&&enet_peer_reset&(server);&&&&&&&&cout&&&"连接服务器失败"&&&&&&return;&&&&}&&&//下面开始发数据ENetPacket&*packet=enet_packet_create(NULL,78,ENET_PACKET_FLAG_RELIABLE);&//创建包strcpy((char*)packet-&data,"hi,哈哈");enet_peer_send(server,1,packet);ENetPacket&*packet1=enet_packet_create(NULL,86,ENET_PACKET_FLAG_RELIABLE);&//创建包strcpy((char*)packet1-&data,"你好啊,呵呵");enet_peer_send(server,2,packet1);enet_host_flush&(client);&//必须使用这个函数或是enet_host_service来使数据发出去//关闭连接enet_peer_disconnect&(server,0);//等待关闭成功while&(enet_host_service&(client,&&event,&5000)&0)&&&&{&&&&&&&&switch&(event.type)&&&&&&&&{&&&case&ENET_EVENT_TYPE_RECEIVE:&&&&&&&&&&&&enet_packet_destroy&(event.packet);&&&&&&&&&&&&break;&&&&&&&&case&ENET_EVENT_TYPE_DISCONNECT:&&&&&&&&&&&&cout&&&"已经成功断开连接"&&&&&&&enet_deinitialize();&&&&&&&&&&&&return;&&&&&&&&}&&&&}//这里就是关闭失败,强制重置enet_peer_reset(server);cout&&&"强制重置"&&&enet_deinitialize();}
阅读(...) 评论()enet_lwip,enet_io,enet_ptpd,enet_uIP这四个都是TI StellarisWare中关于以太网的例程,前三个都是基于lwIP协议栈的,后一个是基于uIP协议栈的。1.enet_lwip,enet_io,enet_ptpd的共同点都是基于lwIP协议栈都包含有web服务器每一个例程都是从两个方面来实现的,比如enet_lwip采用了两种存放网页的方法,一是通过makefsfile把网页数据转换为.h文件,包含到工程里,编译,最后和程序一起写进了flash里边,二是通过直接把设计好的网页文件直接放到SD卡当中,程序会自动检测到SD卡插入,然后从SD中读取网页;enet_io采用了两种控制io的方法,一种是通过Javascript+XMLHttpRequest的方法,一种是通过表单+CGI+SII的方法,这两种方法都可以来控制Kit board上的io(在前段时间的帖子中我也分享了每种方法的一些心得);enet_ptpd也采用了两种对接收的数据包加时间戳的方法,一种是硬件时间戳(这是默认的情况),一种是软件时间戳(通过复位时按住SELECT PUSH BUTTON来关闭硬件时间戳,复位后松开SELECT键启用软件时间戳)。这几个例程对于初学者来说是既爱又恨。一方面,每个例程的含金量较高,设计很严密,规范,两种方法的对比可以学到不少知识;另一方面,由于综合了的东西较多,似乎上手不太容易,包含了很多文件,很多if else,很多define。
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
都采用了DHCP动态分配IP地址和AUTOIP自动分配IP地址,当DHCP动态分配IP地址失败后,就会自动启用AUTO在子网内生成一个IP地址,比如网关IP地址是192.168.0.1时,AUTOIP第一次生成的IP地址一般就是192.168.0.192。.都在代码中添加了locator service。所以用finder可以发现开发板IP地址。对协议栈的配置,都要通过lwipopts.h来进行。总之,这几个例程都有很多部分是相似的,只要细心的分析,总会有很多的收获,我们也可以在这几个例程的基础之上进行一些自己的设计。几个例程中lwIP的不同点:首先各个主文件肯定有是不同的,如enet_lwip.c enet_io.c,enet_ptpd.c,它们的难度也是按顺序由易到难的。每个工程文件夹下都有一个lwipopts.h文件,它们是量体裁衣的。其次一般lmi_fs.c有所不同。这个文件可以认为是一个极其简易的虚拟“文件系统”,其实就是管理一个静态的单向的数组链表,通过比较数组中的文件名来确定文件数据所处的位置。主要就是把存储到flash中的网页文件,io_fsdata.h中的网页数据定位(相当于打开文件),复制到buffer(相当于读文件),释放内存(相当于关闭文件)。如果你的网页时存储在SD卡中的,那么lmi_fs.c中的各个函数要和FATfs中的打开文件,读文件,关闭文件的函数进行一个融合,这样可以通过这个躯壳来操作SD卡中的文件。这一点仔细分析一下enet_lwip例程中的lmi_fs.c中的几个函数,就可以理解了。我还写了两个例程把这个综合的例程分开了,把所谓的两种文件系统分开了。所以需要实现或者修改的就是fs_read(),fs_open(),fs_close(),fs_init()这几个函数而已。在这里提醒的一点就是,在使用makefsfile命令的时候,经常会有人出错。makefsfile -i fs -o io_fsdata.h -r -h ,很多人不解为什么输出的文件名要是io_fsdata.h。原因就是在这个lmi_fs.c里边,有#include "lmi-fsdata.h"。&其次httpd.c里都是相同的,当然根据实际的应用可以进行修改,尤其是其中的send_data()函数,如果没有把握,就不要轻易修改。
在线时间168 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
网上很多文章都提到,LWIP的BUG很多,您怎么看?
在线时间77 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 25, 距离下一级还需 175 积分
一粒金砂(中级), 积分 25, 距离下一级还需 175 积分
&& 不错哦!& 学习了。。。
机遇总是给有准备的人呢
在线时间138 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 47, 距离下一级还需 153 积分
一粒金砂(中级), 积分 47, 距离下一级还需 153 积分
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
回复 板凳 ebuffalo 的帖子
我对lwIP的应用经验还不是很多,尚未有能力能找出什么bug。不过我觉得和商业的协议栈相比可能在某些地方有bug,但是将lwIP协议栈作为学习以太网入门来说,它是很不错的,并且网络上研究它的人,不是在减少而是在增多。 bug可以有,谁没有bug,TI 的StellarisWare中也是有bug的,Keil的编译器是有bug的,所以它们一直都在更新和修正。 我觉得那些说lwIP有bug的人中有一部分是对lwIP并没有很好地使用,理解不够导致误会,所以断定lwIP有bug,运行不稳定,运行不稳定就一定是lwIP的bug吗?如果它真正知道了BUG,完全可以和瑞典计算机科学院的Adam联系一下。 当然也可以把这个问题传上TI的论坛,问问他们,我很想知道是怎么回答的。那些厉害的老外们肯定可以发现BUG。
[ 本帖最后由 academic 于
10:58 编辑 ]
在线时间911 小时
威望3983分
芯币15554枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 3983, 距离下一级还需 2017 积分
五彩晶圆(中级), 积分 3983, 距离下一级还需 2017 积分
LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了
在线时间77 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 25, 距离下一级还需 175 积分
一粒金砂(中级), 积分 25, 距离下一级还需 175 积分
&&& 楼主& 你可以发表下,在这几个例程中,web客户端是如何和服务器进行通信的,通信的具体流程。。
机遇总是给有准备的人呢
在线时间168 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
原帖由 fengzhang2002 于
16:15 发表
LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了
能大概说一下有哪些BUG么?
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
回复 8楼 flyingbing 的帖子
你是指lwIP里各个函数的调用关系吗?
通信流程其实就是浏览器发送get方法(浏览器会建立TCP连接,应用层是HTTP协议)在embedded web server端,会使用httpd中的http_recv()函数会接收到这个TCP数据报中的数据,进行一系列的分析之后,通过文件系统找到要get的文件,然后调用send_data()函数发送网页数据。调用http_sent()函数调整窗口。浏览器端的过程,我说过,可以用firebug来分析,还可以用TCP&UDP debug来分析。对于服务器端,就好好分析一下send_data和http_recv这两个函数。
[ 本帖最后由 academic 于
13:26 编辑 ]
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
上传一张各种协议栈图片的对比:
(121.16 KB, 下载次数: 17)
13:30 上传
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
回复 9楼 ebuffalo 的帖子
通过上面这张图片可以看到,lwIP实现了有些商业协议栈相当的功能,甚至某些方面有过之而无不及,最大的优势是开源、免费,最新版本好像是1.3.1。至于它内部的bug我尚未看到有有人明确指出代码中bug的位置。
[ 本帖最后由 academic 于
13:48 编辑 ]
在线时间118 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 95, 距离下一级还需 105 积分
一粒金砂(中级), 积分 95, 距离下一级还需 105 积分
楼主能不能给我发一下enet_lwip,enet_io,enet_ptpd,enet_uIP这些源文件啊!我很想看看这些源代码!我也是在8962在实现时钟同步的!严重关注楼主的进展!我的邮箱:
&&拜托了!!!!1;P
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
回复 13楼 历史的天空 的帖子
这些例程都是TI StellarisWare里边的例程啊,源文件很容易找到的,还有在阅读源文件的时候关于lwIP和IEEE1588等问题随时欢迎交流,就算是其中某个函数的用法也可以。同时也希望把你的心得也分享一下。
在线时间168 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
以下内容转自ZLG网站,LWIP确实有问题。
在成都zlg买了easyARM8962的开发套件,我使用ucos+lwIP来实现tcp的数据收发,遇到的问题一大堆,不过之前的问题都解决的差不多了,现在遇到几个大问题,如下:
& && &1.PC作服务端,8962做客户端,假如,服务端先不开启,而这时候客户端运行(这种情况非常普遍,作为监控端的设备会一直上电,而pc端会经常关机)经过一段时间以后,再开启服务器,这时候客户端的tcp任务早于进入一个死循环(也就是faultISR),跟踪的结果是,在调用netconn_connect()这个函数的时候,如果不成功,既不会一直阻塞进程,也不会返回任何的错误,而是直接进入一个死循环,现在的问题是,如何才能让我能控制客户端能一直处于连接请求状态,不要进入死循环,返回错误也行啊,
& && &2. 同样问题,假如在建立好连接后,正常的收发数据,这时候断开服务器的连接,这时候的客户端能检测到错误,但是在重新连接的时候有时候根本连接不上,而一旦连接失败,结果都是和上面一样进入一个死循环,
& && &3.连接正常的情况下,如果拔掉网线,8962不能检测到断线,如何解决?
& && &以上问题集中在断线重新连接,如果不成功会进入死循环(faultISR) 请指导如何解决这个问题,我希望能实现调用netconn_connect()的时候要么就一直阻塞直到成功建立连接,要么就一段时间后返回错误代码,我能进行处理,最好是返回错误!
& && &麻烦广州的zlg的技术支持能尽快帮我解决这个问题,我们这个项目就卡在这里了,成都的技术支持对LWip也不太熟悉,服务还是很好的,没办法,我只有论坛求助了,
icepnt,您好!
& &&&你这个问题我们仔细分析了一下,应该是LwIP协议栈自身的缺陷,所以暂时还不能给你一个很明确的解决方法,我们的工程师正在处理这个问题,看看能不能改动一下LwIP弥补这个缺陷,一旦有结果我们将第一时间回复你。
& &&&能留下个联系方式么?我一直卡在这里,项目很急的,本来元旦就该验收了,希望你们能尽快帮助我解决上述问题,你们广州zlg的技术支持一定能轻易解决这个问题的
icepnt,你好!
& &&&你可以联系020-,找任工,他会给你解决的。
希望尽快给我解答这个问题吧,客户都在催着去安装了,现在卡在这里,其他的调试都还没进行下去!!
另外再次说明下情况,上述第二种情况,服务器端开后,8962能检测到断线,之后再次重新连接,往往连接不上,这时候调用netconn_connect()后有三种情况出现:
1.进入faultISR 死循环,不知何故
2.进入OS_TaskIdle 死循环,还是没有从netconn_connect()返回
3.服务端能监测到8962发起的连接并显示连接成功,不过端口并不是8962重新连接的时候指定的那个端口,而是随机的端口,经常是跳到4097端口,重点是,这时候的客户端其实并没有连接成功,也就是还是没从netconn_connect()返回!!
icepnt,您好!
这个问题现在正在测试中,一旦通过会及时联系您的。
问题已经修正,请联系销售!
在线时间463 小时
芯币2378枚
TA的帖子TA的资源
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
纯净的硅(中级), 积分 974, 距离下一级还需 226 积分
回复 15楼 ebuffalo 的帖子
谢谢楼上分享了这样的信息,对于在μC/OS上使用lwIP协议栈目前我还没试过,一直都是在裸奔。我昨天晚上看lwIP协议栈的时候,也发现了它里边有些代码在注释上有错误(注:我的是lwip1.3.0)。lwIP协议栈是灵活性很强的,可能用起来并不是太容易,一不小心容易出现问题各种各样的问题。但是如果肯下功夫,总会弄明白的。而且以后你再去使用商用协议栈会很轻松的,因为当你分析过lwIP代码后,很多关于TCP/IP的理论你都弄明白了,而这一块本身也是很复杂的,商用协议栈把很多事情都替用户做完了,然后封装起来,减少了用户可配置的部分,自然就避免了很多的错误发生的可能性,如果你去学习RL—TCPnet的话肯定要容易很多的。其实不管是什么协议栈都是依据TCP/IP协议族来实现的,这个是通用的。
我认为产生了fault,我们应该更进一步地去分析产生了什么fault,是usage fault,bus fault 还是memory management fault?.
最最重要一点是,免费的,开源的本来不多,lwIP用来学习是很理想的,同时我们也看到TI 的S2E模块用到了lwIP还是很稳定的,而且也山寨了。
对于我个人而言,主要是学习TCP协议栈,不在乎是哪种。
如果是商用的法,谁都要慎重的。
以上是个人的看法,欢迎大家批评指正啊。
[ 本帖最后由 academic 于
15:29 编辑 ]
在线时间11 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
mark 刚分到了9B96用以太网做数据发送作用的任务....
在线时间168 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
回复 7楼 fengzhang2002 的帖子
版主,说一下经验?
在线时间168 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
一粒金砂(中级), 积分 42, 距离下一级还需 158 积分
原帖由 fengzhang2002 于
16:15 发表
LWIP的BUG确实多,但胜在免费,网上资料也比较多,我目前应用在公司产品中叶比较稳定了
版主说其公司产品上只用了UDP,TCP还没有调通。
在线时间707 小时
威望4901分
芯币2900枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 4901, 距离下一级还需 1099 积分
五彩晶圆(中级), 积分 4901, 距离下一级还需 1099 积分
回复 沙发 academic 的帖子
顶顶哈哈哈
荣誉会员勋章
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWORLD 官方微信
Powered by
逛了这许久,何不进去瞧瞧?几种UDP网络库的整理Raknet,UDT,ENet,lidgren-network-gen3
UDT库 https://sourceforge.net/projects/udt/?source=directory
&&& C#包装:/dump247/udt-net
UDT协议是什么?是一种基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)。
UDT协议的主要作用是什么?UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。
那么UDT与UDP的区别又是什么?UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。
UDT的使用场景是什么?由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
(以上问题的答案均摘自wikipedia)当然我今天也不是来当知识搬运工的,而是结合以上UDT协议的基本定义来深入到UDT协议内部去解析它。
UDT协议的主要特性有哪些?
基于UDP的应用层协议: 有基本网络知识的朋友都知道TCP和UDP的区别和使用场景,但是有没有一种协议能同时兼顾TCP协议的安全可靠和UDP协议的高效,那么UDT就是一种。
面向连接的协议:面向连接意味着两个使用协议的应用在彼此交换数据之前必须先建立一个连接,当然UDT是逻辑上存在的连接通道。这种连接的维护是基于握手、Keep-alive(保活)以及关闭连接。
可靠的协议:依靠包序号机制、接收者的ACK响应和丢包报告、ACK序号机制、重传机制(基于丢包报告和超时处理)来实现数据传输的可靠性。
双工的协议:每个UDT实例包含发送端和接收端的信息。
单播的数据流。
新的拥塞算法,并且具有可扩展的拥塞控制框架:新的拥塞控制算法不同于基于窗口的TCP拥塞控制算法(慢启动和拥塞避免),是混合的基于窗口的、基于速率的拥塞控制算法。可扩展的拥塞控制框架开源的代码和拥塞控制的C++类架构,可支持开发者派生专用的拥塞控制算法。
带宽估计:UDT使用对包(PP -- Packet pair)的机制来估计带宽值。即每16个包为一组,最后一个是对包,即发送方不用等到下一个发送周期内再发送。接收方接收到对包后对其到达时间进行记录,可结合上次记录的值计算出链路的带宽(计算的方法称为中值过滤法), 并在下次ACK中进行反馈。
c#包装1:/RainsSoft/enetcs
c#包装2:/RainsSoft/ENetSharp
大家都知道UDP这个东西太不可靠了,存在着乱序,丢包,包重复等缺点,但它的速度快,包有界等优点,但在实际编程中要自己处理乱序啊之类的问题会发疯 的。也许大家说用TCP就得了,第一点TCP的速度比较慢,第二个TCP是一个数据流一样的东西,我们要传数据的话还得处理数据的分界问题,也挺麻烦的。
针对这个问题,ENET这个库实现了一个性能介于TCP与UDP之间,完成可靠(不丢包,按序),保持数据的分界的优点。编程起来也挺方便的。
RakNet库& /OculusVR/RakNet
c#包装:/RainsSoft/RakNet-C-Sharp-binding-project
RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。
RakNet有以下特点:
l 高性能 在同一台计算机上,RakNet可以实现在两个程序之间每秒传输25,000条信息;
l 容易使用 RakNet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;
l 跨平台,当前RakNet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code,Blocks, DevCPP 和其它平台上。
l 在线技术支持 RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。
l 安全的传输 RakNet在你的代码中自动使用SHA1, AES128, SYN,用RSA避免传输受到攻击
l 音频传输 用Speex编码解码,8位的音频只需要每秒500字节传输。
l 远程终端 用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。
l 目录服务器 目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。
l Autopatcher Autopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。
l 对象重载系统
l 网络数据压缩 BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。
l 远程功能调用
l 强健的通信层 可以保障信息按照不同的信道传输
UDT基于一种基于带宽速率控制的拥塞控制算法进行设计,主要用在小数量的bulk源共享富裕带宽的情况下,最典型的例子就是建立在光纤广域网上的网格计算,而在ISP提供带宽有限的情况下运行却显得消耗资源并性能不足。甚至可能被防火墙,或ISP服务商判断为恶意带宽使用攻击。
RakNet是为游戏应用而设计,对于实时性等游戏相关的网络需求有很好的支持,对于大批量数据传输却有点力所不及。raknet的缺点是不支持组播
KCP - A Fast and Reliable ARQ Protocol
源码: /skywind3000/kcp
c#包装:/RainsSoft/kcp-csharp
KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。 连时钟都需要外部传递进来,内部不会有任何一次系统调用。
整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。
KCP协议比较
如果网络从来不丢包,那么你直接用 TCP就行了,甚至直接裸UDP都没关系,但是网络因为丢包造成卡顿,特别是高峰时期丢包会上到10%的情况,移动设备上这个情况更糟糕。
我自己评测过很多, 的作者做过比较详细的评测,在网络变糟糕的情况下,KCP的延迟比 libenet低三倍以上:
worst network lag happen:
asio: 10:51.21
enet: 10:51.21
更详细的评测可以看这里:,感谢 asio_kcp 的作者 zhangyuan 详细对比了 UDT, libenet和 kcp,并给出结论如下:
ASIO-KCP has good performace in wifi and phone network(3G, 4G).The kcp is the first choice for realtime pvp game. The lag is less than 1 second when network lag happen. 3 times better than enet when lag happen.The enet is a good choice if your game allow 2 second lag. UDT is a bad idea. It always sink into badly situation of more than serval seconds lag. And the recovery is not expected.
其他可以左右你选择的情况:
enet has the problem of lack of doc. And it has lots of functions that you may intrest.kcp's doc is chinese.Good thing is the function detail which is writen in code is english. And you can use asio_kcp which is a good wrap.The kcp is a simple thing. You will write more code if you want more feature.UDT has a perfect doc. UDT may has more bug than others as I feeling.
我当年主要测试了 KCP和 TCP/UDT的比较,扫了一眼 libenet觉得协议实现中规中矩,缺乏很多现代传输协议的技术,所以并没有详细测试。而 asio-kcp的作者同时给出了KCP/enet/udt三者的详细比较,为犹豫选择的人提供了更多指引。
The bench mark is for realtime pvp game. For example, the multiplayer first person shooting game.
The requirement of realtime pvp game is packet is small and frequently.
It wants a minimal delay. And the worst delay should be not so worse.
The test client send 500 bytes in every 50 milliseconds. And the server send it back after receiving immediately.
Three frameworks were tested,
- UDP-based Data Transfer Protocol - A Fast and Reliable ARQ Protocol - Reliable UDP networking library
/RainsSoft/lidgren-network-gen3
纯C#实现的UDP开源库,可用于游戏,支持NAT,内部使用的可靠ARQ协议算法没仔细去研究,不知道WIFI以及3G/4G下的表现怎么样,暂时没有测试数据
Copyright (C)2017
All rights reserved.

我要回帖

更多关于 怎么用影梭玩游戏 udp 的文章

 

随机推荐