精华内容
下载资源
问答
  • go-raknet是一个实现RakNet协议基本版本的库,该协议用于Minecraft(Bedrock版)。 它实现Unreliable,Reliable和ReliableOrdered数据包,并以ReliableOrdered发送用户数据包。 go-raknet尝试抽象出与RakNet的直接...
  • 这是一个使用 RakNet 的简单点对点聊天客户端。 使用了 RakNet 的 NAT 穿透客户端插件,因此 NAT 后面的两个对等点有望相互通信。 该代码使用 Jenkins Software 为 RakNet 提供的免费 NAT 穿通服务器。 但是,您也...
  • RakNet

    2021-06-07 08:17:13
    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。外文名RakNet最新版本4.081适用系统Windows,Linux,Mac OS适用平台...

    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。

    外文名

    RakNet

    最新版本

    4.081适用系统

    Windows,Linux,Mac OS

    适用平台

    IOS,Android,Windows Phone 8

    适用引擎

    Unity,Unreal engine

    目录

    RakNet特点

    编辑

    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 强健的通信层 可以保障信息按照不同的信道传输

    RakNet示例

    编辑

    例子:

    #include

    #include

    #include

    #include "RakClientInterface.h" //建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收

    #include "RakNetworkFactory.h" //用于管理我们在程序中使用的类,包括类内存分配和类内存的释放

    #include "RakServerInterface.h" //用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收

    #include "PacketEnumerations.h" //用于处理网络引擎在运行过程中得到的信息

    Packet *packet;//网络传输中用于存储数据的一个数据结构

    /

    /*

    Struct Packet

    {

    PlayerID playerId; //表明了包的出处。每一个连接服务器的客户端都将被分配一个唯一的ID号,用于标识自己。

    Unsigned long length; //数据长度

    Unsigned long bitsize; //比特大小

    Char *data; //包中的数据

    }

    */

    /

    int main(void)

    {

    char str[512];

    RakClientInterface *rakClientInterface;

    RakServerInterface *rakServerInterface;

    printf("(C)客服端 (S)服务器?\n");

    gets(str);

    if (str[0]=='c')

    {

    //初始化一个客户端实例,为它分配内存

    rakClientInterface=RakNetworkFactory::GetRakClientInterface();

    rakServerInterface=0;

    printf("客服端已经建立。");

    }

    else

    {

    rakClientInterface=0;

    //初始化一个服务器实例,为它分配内存

    rakServerInterface=RakNetworkFactory::GetRakServerInterface();

    printf("服务器已经建立。");

    }

    if (rakServerInterface)

    {

    rakServerInterface->Start(32, 0, 0, 60000);// 服务器运行在端口60000处

    /*第一个参数表明你的服务器允许同时连接多少个客户端,这个参数最大可以设置成65535;

    第二个参数做保留之用,设置成0;

    第三个参数用于设置多久进行服务器更新,参数要大于等于0,表示用每隔当前设置的毫秒数进行更新,这里设置的是0;

    最后一个参数用于设置服务器的端口;*/

    }

    else

    {

    // 运行客户端

    printf("输入服务器IP地址:\n");

    gets(str);

    if (str[0]==0)

    strcpy(str, "127.0.0.1");

    rakClientInterface->Connect(str, 60000, 0, 0, 0);

    /*第一个参数表示你要连接的服务器的IP地址,如果是在自己这台计算机调试程序,直接输入”127.0.0.1”或“localhost”;

    第二个参数表示要连接的服务器的端口;

    第三个参数表示要连接的客户端端口,主要就是用于客户端之间交换数据;

    第四个参数不要;

    第五个参数和服务器start函数中的第三个参数一样.*/

    }

    while (1)

    {

    if (rakServerInterface)

    packet = rakServerInterface->Receive();

    else

    packet = rakClientInterface->Receive();

    if (packet)

    {

    switch (packet->data[0])

    {

    case ID_REMOTE_DISCONNECTION_NOTIFICATION:

    printf("另一个连接已经断开.\n");

    break;

    case ID_REMOTE_CONNECTION_LOST:

    printf("一个客户端丢失连接.\n");

    break;

    case ID_REMOTE_NEW_INCOMING_CONNECTION:

    printf("一个客户端已上线.\n");

    break;

    case ID_CONNECTION_REQUEST_ACCEPTED:

    printf("我们的连接要求已经接受.\n");

    break;

    case ID_NEW_INCOMING_CONNECTION:

    printf("有新连接.\n");

    break;

    case ID_NO_FREE_INCOMING_CONNECTIONS:

    printf("服务器已满.\n");

    break;

    case ID_DISCONNECTION_NOTIFICATION:

    if (rakServerInterface)

    printf("客户端丢失.\n");

    else

    printf("连接中断.\n");

    break;

    case ID_CONNECTION_LOST:

    if (rakServerInterface)

    printf("客户端丢失连接.\n");

    else

    printf("连接丢失.\n");

    break;

    printf("ID信息 %i 已经到达.\n", packet->data[0]);

    break;

    }

    if (rakServerInterface)

    rakServerInterface->DeallocatePacket(packet);

    else

    rakClientInterface->DeallocatePacket(packet);

    }

    }

    // TODO - Add code body here

    //getch();

    if (rakClientInterface)

    RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);

    else if (rakServerInterface)

    RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);

    return 0;

    }

    展开全文
  • raknet教程

    2018-08-17 09:14:23
    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。
  • RakNet-Python-开源

    2021-04-26 00:56:20
    该项目的目标是为RakNet UDP网络库版本3.0提供一组Python绑定。 RakNet-Python是在Boost.Python库的帮助下实现的,并试图模仿RakNet的原始C ++接口。
  • 顶级UDP网络协议库Raknet在Unity3D里使用的示例
  • 拉克网 用node.js编写的RakNet服务器实现 该项目不隶属于Jenkins Software LLC或RakNet
  • 基于raknet游戏服务器引擎开发教程及demo源代码.zip 基于RakNet编写的C/S服务器客户端
  • Raknet 4.0

    2013-10-15 20:03:00
    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。 RakNet有以下特点: l 高性能 在同一台计算机上,RakNet可以实现...
  • RakNet:RakNet是面向游戏程序员的跨平台,开源C ++网络引擎。 较低级别的框架支持较高级别的功能,例如游戏对象复制,语音聊天和修补
  • RakNet Unity UDP 网络库

    2018-05-16 11:05:33
    RakNet UDP 网络库 。已经生成可以被 Unity 直接使用的 UDP 库
  • Raknet研究

    千次阅读 2018-08-13 16:13:46
    Raknet Send操作 合理使用传输模式与传输通道 收发数据包模型 压测性能 游戏性能优化,需要从多个层面进行。美术资源层,降低不必要的网格顶点数、使用可硬件加速的贴图格式和合并渲染队列等。策划需求层,...

    游戏性能优化,需要从多个层面进行。美术资源层,降低不必要的网格顶点数、使用可硬件加速的贴图格式和合并渲染队列等。策划需求层,需要掌握技术基本原理,规避技术难度高、风险大的游戏需求、使用“障眼法”掩盖技术缺陷等。程序技术层面,尽可能不改变需求下实现更优的算法、同时使用严格的测试用例(如同步坐标还原测试)校对核心算法的准确性。而在本文旨在考虑的网络层性能忧化,除了考虑数据流量大小和更忧化封/解包算法外,还可以从OSI七层网络协议中寻找办法,较容易操作的是网络传输协议,协议代表有TCP、UDP和SCTP。SCTP有良好的特性,但该协议起步晚目前尚未广泛使用,大多应用程序开在TCP和UDP中作出选择。

    UDP更适合实时类游

    任何技术都有优缺点,是场景选择技术,而不是技术带着场景走。TCP提供的发送窗口、可靠性、延时ACK、Nagle算法和慢启动与拥塞控制等功能,在特定场景下有时反而成为负担。但是如果数据逻辑有严格的顺序逻辑关系,就应该使用TCP而不是Udp。UDP的网络传输更快,这非常适合实时类型游戏。以下是来自互联网,有关TCP与RUDP在弱网络掉包的情况下传输性能测试,横轴表示RTT(往返时间)、纵轴表完成输出占比量。
           右上角的图例尤其突显RUDP在高掉包率网络环境下的优势,RUDP在[50-150]毫秒内完成约70%的数据传输量,而TCP完成的传输量较为平均地分布在各个延时区。再依据另外3个数据图,更能反映出RUDP相比TCP在更短的延时内完成了大部分数据量的传输

    总结出TCP以下特性,减弱其传输性能
    * 发送窗口
    应用层调用Send时,数据并没有立即送出,只是先将数据拷贝到发送缓存区,此后由发送窗口机制分组送出。

    * 延时ACK
    TCP同时发送多个分组并且会累积ack,以太网最大的数据帧空间是1518字节,而一个ack占用空间约60字节,只占总空间的4%。为了提高宽带利用率,以及降低大量ACK包造成网络拥堵,TCP延迟40ms发送,如果这段时间内有数据发送到对端,则捎带发送ack

    * Nagle算法
    TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块,算法要求一个TCP连接上最多只能有一个未被确认的未完成的分段,在该分段ack到达之前不能发送其他的分段。
           假如client发送一个http请求个server。这个请求时1600byte,MSS是1460byte。那么就会分成两个TCP包,第一个1460byte,剩下的140byte放在第二个包。第一个包发送到server时,由于server开启了delay ack,所以没有立即ack,又因为server没有收到完整的http请求包,所以也没有立即进行http response,这就导致ack会一直等到40毫秒的delay时间。其实如果client立即发送第二个包,server收到后立即做出http response也不会有问题。问题时client启动了Nagle算法,第一个包没有收到ack,第二个包就不会立即发送出去。两边相互等m,这就是性能问题的核心原因。解决办法是向TCP套接字设置选项TCP_NODELAY关闭Nagle

    * 慢启动与拥塞控制
    慢启动与拥塞控制都是为防止过多的数据注入到网络,造成网络拥堵。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次灵气都能正确的接受确认。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小cwnd。然而不断增大的发送窗口会增大网络负载,所以设置一个慢开始门限值ssthresh,当cwnd > ssthresh时,使用拥塞控制算法,停用慢启动算法。

    Raknet

    官网主页可以了解到,Raknet初始是为多人对战游戏而设计的网络库,之后得到不断完善并转向商用。2014年宣布在BSD协议下开源(可以自由的使用,修改源代码)。 Raknet除了支持可靠和多通道传输,还包含游戏在应用的通用功能,如http收发、语音收发、NAT穿透、email发送和信息加密等。Unity3d 4.x的版本接入了Raknet,但Unity3d接入得不并完善1
    Unity3d 4.x网络底层使用了raknet 3.7.31

    优点:(源自互联网2,匹配之后的压测会有更好的结论)
    * 高性能 在同一台计算机上,Radnet可以实现在两个程序之间每秒传输25,000条信息;
    * 支持Window、Android和iOS平台
    * 多个传输通道,提高带宽利用率
    * 信息加密传输

    缺点:(源自互联网3,匹配之后的压测会有更好的结论)
    * Raknet理论上可以支持多个客户端和服务器之间每秒4W个消息的ping-pong测试。但是不稳定,如果某些原因导致消息堆积,则会严重影响发送和接受的响应时间,会达到秒级。
    * Raknet如果消息超过承受的极限,底层的逻辑上导致不断会恶化卡的现象,表现出现吃内存,底层线程陷入循环,执行效率下降。
    * 目前的Raknet版本不支持发送线程,虽然有发送线程的宏,但是打开后编译不过,还未具体继续研究下去。
    * 压测过程中不同的客户端连接数对应能支撑的消息数量也会有明显的差异,主要差距来自轮询过程中会raknet底层会进行组包的大大的减少了实际发包的数量

    Send操作

    在所有网络库里,使用最频率非send接口莫属。Raknet里,它定义在文件RakPeerInterface.h,由子类RakPeer实现,以下是Send接口签名,其中涉及几个重要概念:发包优先级和传输通道。

    virtual uint32_t Send( const char *data, 
                        const int length, 
                        PacketPriority priority, 
                        PacketReliability reliability, 
                        char orderingChannl, 
                        const AddressOrGUID systemIdentifier, 
                        bool broadcast, uint32_t forceReceiptNumber=0)=0;
    • data
      数据缓存指针

    • length
      数据缓存长度

    • PacketPriority(传输优先级)

    PacketPriority说明
    IMMEDIATE_PRIORITY最高优先级,内部不缓存、不合并数据包立即发送
    HIGH_PRIORITY每发两次IMMEDIATE_PRIORITY, 发送1次HIGH_PRIORITY
    MEDIUM_PRIORITY每发两次HIGH_PRIORITY, 发送1次MEDIUM_PRIORITY
    LOW_PRIORITY每发两次MEDIUM_PRIORITY, 发送1次LOW_PRIORIT

    注意:HIGH_PRIORITY及以下类型,Raknet内部会缓存数据包10ms后再发送
    由此可猜,为了提高带宽使用率,Raknet内部缓存数据包,除非使用IMMEDIATE_PRIORITY

    • PacketReliability(传输模式)
      假设对端的发送序列[1,2,3,4,5],以下列出各个可靠右模式下收到序列的可能情况
    PacketReliability说明可收到的序列
    UNRELIABLE不可靠乱序[5, 1, 6]
    UNRELIABLE_SEQUENCED不可靠但部分按序[5] (6掉包, 1,2,3,4迟到达被丢弃)
    RELIABLE可靠乱序[5,1,4,6,2,3]
    RELIABLE_ORDERED可靠完全按序[1,2,3,4,5,6]
    RELIABLE_SEQUENCED可靠部分按序[5,6] (1,2,3,4迟于5到达被丢弃)

    * OrderingChannel(传输通道)
    在多数RGP游戏战斗中,允许英雄移动的同时释放技能。我们可以想像逻辑开发程序员将角色位置和技能数据包,放到相同的UDP socket下可靠发送。使用可靠传输的UDP,当技能掉包需要重发,此时会阻断英雄位置信息送出,除非技能重发成功。按我们的份析,英雄位置与技能在大多情况下,不存在很强的依赖关系。解决这个问题,我们可以创建多个可靠ucp socket,不同类型的数据在不同的socket下发送,但是这增加系统资源消耗,同时客户端网络框架需要编写代码管理多个socket。
    Raknet在单个连接上创建了传输通道的概念,可以用来解决上面问题,并且提高数据传输效率。这就是传输通道,但仅在完全按序系列模式(*_ORDERED)与部分按序系列模式(*_SEQUENCED)下有作用,分别支持最大32个通道,即最大64个通道,并且它们之间互不影响。传输通道只面向对发送端,接收端看不到通道概念。(图片来源4)

    • AddressOrGUID
      发送目标设备地址

    • broadcast
      是否广播发送,广播对象不包含systemIdentifier参数指定的目标设备

    • ForceReceiptNumber(数据包序号)
      ForceReceiptNumber = 0,数据包使用Raknet内部自增长序列号。
      ForceReceiptNumber > 0,数据包使用这个传入的参数值作为序列号。

    • 返回值
      返回数据包使用的序列号

    合理使用传输模式与传输通道

    根据数据包的需求特性,利用Raknet的传输模式和传输通道,细化发送规则,压榨性能。还是以RPG游戏玩法为例,以下列出数据包特性,并尝试推理它们的传输模式和传输通道

    数据包需求PacketReliabilityOrderingChannel
    英雄位置只关心最新的角色位置RELIABLE_SEQUENCED1
    英雄技能技能连招效果需要严格顺序关系RELIABLE_ORDERED1
    英雄生命值缺失的数据包影响对战结果,生命值ui没有明显的过渡只显示最新生命数值RELIABLE_SEQUENCED2
    文字聊天严格的对话顺序、缺失的内容可能产生模糊的话题RELIABLE_ORDERED2
    快捷聊天错误队友信息顺序并不影响战斗数据,RELIABLE

    【英雄位置】与【英雄技能】均在通道1并不冲突,因为它们分别在*_ORDERED和*_SEQUENCED模式上进行的,通道传输仅只在这两个传输模式系列运作,所以RELIABLE模式下的【快捷聊天】没有无传输通道。

    收发数据包模型

    不好的设计可能会使业务层与网络层耦合过多,导致此后的游戏扩展受限。现在来讨论客户端业务层与网络层的交互关系,重点考虑何时发包和收到包后如何通知逻辑层。下文大部分内容整理自Raknet官方文档Send packets,原文提及了3种模型,每种都有各自的优缺点,实践过程中应灵活运用。

    • 行为函数内发送
      ShootBullet控制层的函数负责角色的射击行为,需要的参数包括:射击ID、射击位置、射击方向。每次外部调用,ShootBullet内部都会发送一次数据包

      优点:
      统一封装了发包逻辑,不必担心增加的外部调用,会忘记发送数据包
      缺点:
      然而射击行为与数据包在设计上产生了强耦合关系。本端为了处理对端相同行为的网络包,需要增加一个中间层函数DoShootBullet,参数决定这是一主动还是被动的数据同步,来决定是否发送网络包。另外,如果要增加发送参数(如子弹剩余量),这些参数会污染ShootBullet接口原来的设计原意,当然这些数据可以从全局数据层获取获取。无论如何这类强耦合关系设计时需要十分注意。

    • 行为函数后发送
      另一个收发模型就是把发送网络包,放在ShootBullet之后执行。

      优点:
      解决了主、被动同步和参数扩展问题。
      缺点:
      需要跟踪可能触发ShootBullet的逻辑,新增的外部调用容易忘记主动发送数据包。

    • 循环检查策略发送
      另外一个例子:当角色的生命值低于0时,发送数据包。我们做法是每次游戏帧都检查玩家的生命值,仅当第一次发现生命值低于0时,通知服务端。

      优点:
      同样解决了主、被数据同步。封装了面向数据层的网络发送层,断开了与逻辑层的关系。我们还可以在这个发包层自定义发包策略,如角色位置同步频率等
      缺点:
      逻辑开发程序员需要了解发包层的工作原理,以便逻辑层的操作能产生正确的数据包去通知服务端

    压测性能

    待完成



    原文:
    https://lizijie.github.io/2018/08/13/Raknet%E7%A0%94%E7%A9%B6.html

    作者github:
    https://github.com/lizijie

    展开全文
  • raknet网络库

    2017-10-30 20:36:00
    RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。
  • RakNet-3.717.zip RakNet

    2012-06-06 08:24:47
    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。  Radnet有以下特点:  l 高性能 在同一台计算机上,Raknet可以...
  • RakNet 的DLL库文件

    2012-02-21 12:52:12
    RakNet的编译动态库,包含了Debug和Release版。是VS2005下编译。RakNet RakNet RakNet RakNet RakNet
  • RakNet入门介绍

    2021-06-07 08:17:08
    #include "../RakNet/src/RakPeerInterface.h"#include "../RakNet/src/RakNetTypes.h"#include "../RakNet/src/MessageIdentifiers.h"#include "../RakNet/src/BitStream.h"#include "../RakNet/src/RakString.h"#i...

    #include "../RakNet/src/RakPeerInterface.h"

    #include "../RakNet/src/RakNetTypes.h"

    #include "../RakNet/src/MessageIdentifiers.h"

    #include "../RakNet/src/BitStream.h"

    #include "../RakNet/src/RakString.h"

    #include "../RakNet/src/StringCompressor.h"

    int StartServer();

    int StartClient(void* param);

    //测试下RakNet

    void main(int argc, char* argv[]) {

    PTHREAD pThread = 0;

    RakNet::RakPeerInterface* peer = RakNet::RakPeerInterface::GetInstance();

    if (!peer)

    {

    LogUtils::e(LOG_TAG, "main get peer failed.");

    system("pause");

    return;

    }

    LogUtils::i(LOG_TAG, "(C)客服端 (S)服务器?");

    char str = getchar();

    if (str == 'c')

    {

    StartClient(NULL);

    //PlatformAbstract::CreateThread(pThread, (THREADPROCTYPE)&StartClient, NULL);

    LogUtils::e(LOG_TAG, "::main 客服端已经建立。");

    }

    else

    {

    StartServer();

    //PlatformAbstract::CreateThread(pThread, (THREADPROCTYPE)&StartServer, NULL);

    LogUtils::e(LOG_TAG, "::main 服务器已经建立。");

    }

    system("pause");

    }

    这里是一个测试方法 可以直接放到测试工程中测试

    int StartServer() {

    //给服务器端创建一个实例

    RakNet::RakPeerInterface* pPeer = RakNet::RakPeerInterface::GetInstance();

    if (NULL == pPeer)

    {

    LogUtils::e(LOG_TAG, "TestFunc get pPeer failed.");

    return -1;

    }

    else

    {

    LogUtils::e(LOG_TAG, "::TestFunc ---------MyChatServer Init Success(C)-----------");

    }

    RakNet::Packet* pPacket;

    LogUtils::i(LOG_TAG, "::TestFunc Start Server .....");

    //启动服务器

    RakNet::SocketDescriptor sd = RakNet::SocketDescriptor(6000, 0);

    RakAssert(RakNet::RAKNET_STARTED == pPeer->Startup(1, &sd, 1));

    //设置最大链接数

    pPeer->SetMaximumIncomingConnections(1);

    auto boundAddress = pPeer->GetMyBoundAddress();

    const char* sAddr = boundAddress.ToString();

    LogUtils::e(LOG_TAG, "::StartServer sAddr: %s", sAddr);

    //

    while (1)

    {

    for (pPacket = pPeer->Receive(); pPacket; pPeer->DeallocatePacket(pPacket), pPacket = pPeer->Receive())

    {

    LogUtils::e(LOG_TAG, "StartServer pPacket type: %d", pPacket->data[0]);

    switch (pPacket->data[0])

    {

    case ID_REMOTE_DISCONNECTION_NOTIFICATION: {

    LogUtils::e(LOG_TAG, "StartServer Another client has disconnected");

    }break;

    case ID_REMOTE_CONNECTION_LOST: {

    LogUtils::i(LOG_TAG, "StartServer ID_REMOTE_CONNECTION_LOST");

    }break;

    case ID_REMOTE_NEW_INCOMING_CONNECTION: {

    LogUtils::i(LOG_TAG, "StartServer ID_REMOTE_CONNECTION_LOST");

    RakNet::BitStream bs;

    bs.Write < RakNet::MessageID>(ServerConnectBack);

    RakNet::StringCompressor::Instance()->EncodeString(pPacket->systemAddress.ToString(true), 255, &bs);

    }break;

    //client端调用Connect后收到的server响应

    case ID_CONNECTION_REQUEST_ACCEPTED: {

    LogUtils::i(LOG_TAG, "StartServer ID_CONNECTION_REQUEST_ACCEPTED");

    RakNet::BitStream bsOut;

    bsOut.Write((RakNet::MessageID)ID_USER_PACKET_ENUM + 1);

    bsOut.Write("Server Say Hello.");

    pPeer->Send(&bsOut, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, pPeer->GetMyBoundAddress(), false);

    }break;

    //server端收到来自client的Connect

    case ID_NEW_INCOMING_CONNECTION: {

    LogUtils::e(LOG_TAG, "StartServer ID_NEW_INCOMING_CONNECTION");

    }break;

    case ID_NO_FREE_INCOMING_CONNECTIONS: {

    LogUtils::e(LOG_TAG, "StartServer ID_NO_FREE_INCOMING_CONNECTIONS");

    }break;

    case ID_DISCONNECTION_NOTIFICATION: {

    LogUtils::e(LOG_TAG, "StartServer ID_DISCONNECTION_NOTIFICATION");

    }break;

    case ID_CONNECTION_LOST: {

    LogUtils::e(LOG_TAG, "StartServer ID_CONNECTION_LOST");

    }break;

    case ID_CONNECTION_ATTEMPT_FAILED: {

    LogUtils::e(LOG_TAG, "StartServer ID_CONNECTION_ATTEMPT_FAILED");

    }break;

    //用户自定义数据包

    case ID_USER_PACKET_ENUM + 1:

    {

    LogUtils::e(LOG_TAG, "StartServer recv ID_USER_PACKET_ENUM + 1: %d", ID_USER_PACKET_ENUM + 1);

    RakNet::RakString rs1, rs2;

    RakNet::BitStream bsIn(pPacket->data, pPacket->length, false);

    bsIn.IgnoreBytes(sizeof(RakNet::MessageID));

    //bsIn.Read(rs); //提取字符串

    RakNet::StringCompressor::Instance()->DecodeString(&rs1, 255, &bsIn);

    RakNet::StringCompressor::Instance()->DecodeString(&rs2, 255, &bsIn);

    LogUtils::e(LOG_TAG, "::StartServer Recv User Data: %s %s %s", pPacket->systemAddress.ToString(true, '|'), rs1.C_String(), rs2.C_String());

    }

    break;

    default: {

    LogUtils::i(LOG_TAG, "::TestFunc Message with identifier %i has arrived", pPacket->data[0]);

    }break;

    }

    }

    sleep(100);

    }

    //

    RakNet::RakPeerInterface::DestroyInstance(pPeer);

    }

    int StartClient(void* param) {

    //获取RakNetPeer接口

    RakNet::RakPeerInterface* peer = RakNet::RakPeerInterface::GetInstance();

    if (!peer)

    {

    LogUtils::e(LOG_TAG, "::StartClient get peer failed.");

    return 0;

    }

    RakNet::SocketDescriptor sd = RakNet::SocketDescriptor(0, 0);

    RakAssert(RakNet::RAKNET_STARTED == peer->Startup(1, &sd, 1));

    LogUtils::i(LOG_TAG, "::StartClient get peer success");

    RakAssert(RakNet::CONNECTION_ATTEMPT_STARTED == peer->Connect("127.0.0.1", 6000, 0, 0, 0, 0));

    while (peer->IsActive())

    {

    //开始发包了

    LogUtils::i(LOG_TAG, "::StartClient %d 发包", GetTickCount());

    RakNet::BitStream bIn;

    bIn.Write<:messageid>(ID_USER_PACKET_ENUM + 1);

    RakNet::StringCompressor::Instance()->EncodeString("Client Say Hello", 255, &bIn);

    RakNet::StringCompressor::Instance()->EncodeString("Client Say NMH", 255, &bIn);

    //注意broadcast参数 如果是true,则发广播,systemidentifier表示不发送地址,一般使用常量 RakNet::UNASSIGNED_SYSTEM_ADDRESS

    //如果是false,则往systemidentifier指定的ip和端口处发送

    //如果发包是有序的,则channel指定了信道,同一信道的具有递增的排序值,避免有多种有序消息的排序值相互干扰

    uint32_t sendrs = peer->Send(&bIn, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, RakNet::SystemAddress("127.0.0.1", 6000), false);

    LogUtils::e(LOG_TAG, "StartClient sendres: %d", sendrs);

    Sleep(1000);

    }

    peer->Shutdown(1000);

    RakNet::RakPeerInterface::DestroyInstance(peer);

    peer = NULL;

    LogUtils::e(LOG_TAG, "Disconnect from Server. StartClient peer closed");

    return 0;

    }

    展开全文
  • 请注意,这不是RakNet协议的完整实现,它目前仅提供X-Plane为其大型多人服务器提供的功能。已知限制包括: 该服务器在重新传输未确认的可靠数据包方面做得不好,因为我们只在MMO服务器中发送了不可靠的数据包。 我们...
  • 先解释一下这个题目:这个第三方依赖,主要是RakNet里面用到了很多其他相关的库或游戏引擎。例如实时语音用的是speex语音编解码库。正文:下面列举的是一些没有第三方库或引擎支持无法编译的一些工程,以及从何处...

    先解释一下这个题目:这个第三方依赖,主要是RakNet里面用到了很多其他相关的库或游戏引擎。例如实时语音用的是speex语音编解码库。

    正文:

    下面列举的是一些没有第三方库或引擎支持无法编译的一些工程,以及从何处可以得到这些依赖库或引擎。这些工程都是可选的:可以使用RakNet而不适用他们。Unpack to是工程,库在VS工程编译步骤中设置的默认路径,可以手工修改。

    IrrlichtDemo

    端到端第一人射击例子,展示了PHPDirectoryServer,ReplicaManager3,和NAT穿透

    Unpack to: C:\irrlicht-1.7.2\include

    Ogre3DInterpDemo

    客户端/服务器 ReplicaManager3 和 插入例子

    下载地址:http://www.ogre3d.org/download

    Unpack to: 没有关系,使用环境变量 $(OGRE_HOME)

    最后检查:预编译二进制1.7.4. OGRE_HOME 设置为 C:\OgreSDK_vc9_v1-7-4.

    AutopatcherMysqL 库

    AutopatcherServer工程支持的两种数据库之一。仅仅需要两个中的一个。

    下载地址:http://dev.MysqL.com/downloads/

    Unpack to: C:\Program Files (x86)\MysqL\MysqL Server 5.1

    注:MysqL用于AutopatcherServer要比Postgresql慢一个量级。

    AutopatcherPostgresqlRepository

    AutopatcherServer工程支持的两种数据库之一。仅仅需要两个中的一个。在安装过程中,确定检查了开发者工具,否则不会安装头文件。

    下载地址:http://www.postgresql.org/download/

    Unpack to: C:\Program Files (x86)\Postgresql\9.1

    sqlite\Logger\D3D9Samples\Matrices

    这个例子假设安装了DirectX SDK。从http://www.microsoft.com可以下载DirectX SDK。下载完毕使用它的时候需要设置VS的全局库和包含路径。

    Lobby2Server PGsql

    用于Lobby2 系统的数据库后台,存储了用户信息,部族信息,好友和其他的持久化数据。

    下载地址:http://www.postgresql.org/download/

    Unpack to: C:\Program Files (x86)\Postgresql\8.3

    RoomsAndLobbyGFx3

    用于RoomPlugin和Lobby2系统的可视化前端,可以登录和现实房间列表。注意:Scaleform需要注册,并且不是免费的。

    下载地址:http://www.scaleform.com/

    Unpack to: 没有关系,使用环境变量$(GFXSDK)

    AutopatcherClientGFx3

    AutopatcherClient系统的可视化前端。注意: Scaleform需要注册,并且不是免费的。

    下载地址:http://www.scaleform.com/

    Unpack to: Doesn't matter,uses enviroment variable $(GFXSDK)

    RakVoiceDSound

    RakVoice三个实现之一,支持DirectSound,FMOD,和PortAudio。PortAudio已经包含在了RakVoice工程中。除非你打算使用DirectSound,否则你不需要看这个工程。

    下载地址:http://msdn.microsoft.com/en-us/directx/aa937788.aspx

    Unpack to: 没有关系,使用环境变量$(DXSDK_DIR)

    RakVoiceFMOD

    RakVoice三个声音实现中的一个,支持DirectSound,FMOD,和PortAudio。PortAudio已经包含在了RakVoice工程中。除非你打算使用FMOD,否则你不需要关注这个工程。注意FMOD不是免费的哦。

    下载地址:http://www.fmod.org/index.PHP/download

    Unpack to: C:\Program Files\FMOD SoundSystem

    最后检验一下:Fmod 4.38.07

    RPC3

    使用C++和便自动的序列化的远程调用。支持网络的信号和时间槽。注意:boost的大部分功能不要求,仅仅需要RPC3使用的一些文件。如果不想使用Boost,可以使用RPC4插件代替,它与RakNet版本3中的RPC有类似的功能。

    下载地址:http://www.boost.org/users/download/

    Unpack to: c:/boost_1_48_0

    注意:如果不想安装boost,可以使用RPC4,但是它不能够直接调用C++的成员函数,和自动序列化方法。

    总结

    如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

    本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

    如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

    展开全文
  • lib 包含用于 RakNet 的预编译二进制静态库,它是从 20150108 上来自 github 的源代码构建的,用于 RakNet4。 RakNet 的源代码可以在这里找到 请注意,您不能将免费的 RakNet 用于超过 100K 预算的商业用途,请...
  • 简单封装了一个Raknet 提供给Delphi使用. 附源码.
  • 低级raknet实施 安装: Linux / MacOS-> pip3 install praknet Windows-> pip install praknet 用法: 服务器-> from praknet import packets from praknet import server import struct def encode_pos(pos...
  • RakNet2.0.unitypackage

    2020-09-09 17:03:05
    Unity3d Raknet封装,包含服务器与客户端示例,已支持Windows平台和Android平台
  • raknet DLL for C

    2012-09-13 15:19:52
    raknet DLL for C 用swig生成的。
  • 简介RakNet在Win平台上已经实现消息、语音、文件传输了,但在Android平台下尚未实现,笔者决定把源码移植到Android平台下测试。详情实现消息项目自带Chat Example Client和Chat Example Server实现消息,源码简单...
  • C# Udp协议 RakNet C-Sharp

    2019-11-23 10:18:01
    RakNet RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏. 个人编程环境 vs2017 /net4.5.1/C# dll 引用 用到两个文件:RakNetDotNet....
  • RakNet源代码 网络

    2011-12-28 14:25:45
    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。 本文给出的是raknet最新版的源代码,编译完之后就可以使用!
  • RakNet_3.7_Doc

    2009-10-06 21:44:52
    RakNet 是一款网络通讯开源引擎 此乃 RakNet 3.7 的文档
  • 基于RakNet的C ++ 11通用客户端和服务器,用于实时和回合制游戏。 依存关系: 拉克网 Google协议缓冲区 这两个依赖项都作为子模块存在,并内置于CMake Biribit脚本中。 不幸的是,protoc必须位于您的PATH中才能成功...
  • RakNet可靠的UDP网络传输Qt版,支持最新的qt版本,兼容老的qt版本。下载后有pro文件,直接打开编译

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,225
精华内容 890
关键字:

raknet