一日一点RakNet(6)--帮助手册

 

帮助手册

 

工程设置

 

在教程中,所有的图片和界面参考的是VS2005,微软版权。同等参数配置你的编译器。

1. 创建Win32控制台工程,将它命名为ChatServer

 

2. 选择控制台应用程序,以及空工程。选择Windows应用程序也是可以的。

 

3.加入RakNet源文件到工程中。可以右键点击工程名字,选择Add,然后是Exiting标签。浏览到你下载的RakNet,转到源码目录,点击shift键,选择第一个文件,然后点击最后一个文件,点击OK。

4. 在工程中加入一个main文件。右击工程名,选择Add,然后选择New标签。在VisualC++选择C++file,命名为main.cpp。

5. 因为我们将文件放到了目录而不是工程中,需要包含目录到include路径,这样我们不需要在每次#include时输入完整的路径。右键点击“Chat Server”工程名字,选择属性,在顶端选择下拉菜单,选择“All Configurations”,选择C/C++/General/Additional Include Directory。将rakNet的路径加到Additonnal directory一项,然后点击OK。

6. 下一个 连接ws2_32.lib,从同一个对话框,选择Linker/General,加入到Additional Dependencies 中

7. 修改字符集为not set。这个是基于strings的数组使用的,与Unicode和宽字符集相对。

 

教程代码实现

1. 设计

       以聊天服务器以尽可能基础开始。他应该有两个主模式,服务器和客户端。服务器会接受一个客户端消息。客户端会在启动后发送一个消息到服务器。将所有要输入的变量硬编码到程序中,这样我们不需要将非网络的一些东西和这些代码混在一起。

 

2. 第一次编译

       创建主函数。询问用户是想要运行一个client还是Server。生成对等段实例,然后使用合适的参数为Server或Client调用Startup。在结束时要销毁对等段。

       试着在第一个程序中写下。完成后,参考如下代码。

       点击F7或Build。应该可以成功编译。如果没有,参考FAQ,它给出了为什么编译不成功,以及如何修改它。如果在里面无法找打答案,将问题发布到论坛上。

 

3. 增加功能

       现在我们有了一个客户端和服务器实例,我们需要知道它能做什么。最好的方法就是去看源码:RakPeerinterface.h。它包含了所有类得函数,加上详细的注释。看Startup和Connect函数的注释。也应该看一下SetMaximumInconmingConnections的注释。

       在代码中,服务器创建之后,增加代码启动服务器。它需要一些参数,可以根据注释中描述的,按照自己的想法设置这些参数。

       在客户端进行相同的设置。在生成代码后,增加链接到服务器的代码。它需要一个IP,加入读取IP地址的代码。服务器的端口,或者让用户输入端口,或者硬编码到代码中。客户端的端口,或者放入代码读取,或者放置为0,进行自动选取。

       这些就是要做的启动一个服务器或链接客户端到服务器。确定是否链接成功,需要能够从网络系统中读取胸袭。在RakPeerInterface.h中,可以发现Receive函数。这个函数返回“Packet”结构体,这个结构体在RakNetTypes.h中定义。它封装了一个消息,非常简单。现在就去看一下。

       可以看到参数“Char * data”,所有的包涵了一个字节数组。这些字节可以是你要发送的任何数据。数字的长度有length和bitSize域指定。RakNet使用的约定是在第一个字节定义的,可以告诉你这个数据是什么数据。这些标识符是在MessageIdentifier.h中定义。现在就去看看这些定义。

       你会看到非常少的几个预定义枚举数据。你应该快速读一读注释。现在我们仅仅关心那些连接枚举类型数据。因此你接下来的编程步骤如下:

      1.为程序主体创建一个循环。

       2. 在循环中,调用Receive,存储返回的指针。

       3. 如果包变量不是0(意味着有数据包),检测Pakcket::data的第一个字节。看一下那个连接相关的枚举值符合(可以使用switchcase来实现)

       4. 打印出与枚举类型一起的注释

       5. 正如注释中所描述,使用完了pakcet指针,要将它传递给DeallocatePakcet方法释放资源。

 

       首先试着自己写一下,写完之后,参考例子代码2

       这时,你应该能够欲行两个实例,连接它们。如果不能连接,参考FAQ或者将问题发送到论坛。如下是例子的输出内容。

       Server output

       (C)lient or (S) erver

       S

       Starting the server

       A connection is incoming.

      

       Client  Output

       (C)lient or (S) erver

       C

       Enter Server IP 或点击Enter使用默认值127.0.0.1

       127.0.0.1

       Starting the Client

       Our connection request has been accepted。

       现在准备发送输入的数据。

       下一步编程是:

       1. 增加一个用户定义的枚举类型,作为你自己的消息的第一个字节

       2. 当客户端成功连接以后,使用RakString()发送一个字符串。在服务器端读取信息,打印出来。

       写完后,参考例子代码3

       客户端输出应该和前面类似。服务器端打印“Hello World”

       (C)lient or (S)erver?
       s
       Starting the server.
       A connection is incoming.
       Hello World

      要获得更多设置工程的信息,可以参考下一页:Compiler setup

     

     注:文章中有部分网页连接没有设置,对应英文查看相应连接。

 

     By   北洋小郭

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。   Radnet有以下特点:   l 高性能 在同一台计算机上,Raknet可以实现在两个程序之间每秒传输25,000条信息;   l 容易使用 Radnet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;   l 跨平台,当前Radnet支持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支持两种版权,如果你是做免费游戏,RakNet将是免费的。相反,你必须支付一定的费用。   从这里你可以下载到最新的RakNet:   http://www.rakkarsoft.com/raknet/downloads/RakNet.zip   例子:   #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)   {  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值