启动RakNet
StartupResult RakPeer::Startup( unsigned short maxConnections, SocketDescriptor *socketDescriptors, unsigned socketDescriptorCount, int threadPriority );
首先要做的就是调用RakPeerInterface::Startup()。Startup()会做如下的一些工作:
1. 生成RakNetGUID,用于唯一标识RakPeerInterface实例。可以使用如下方法获取
RakNetGUID g = rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS);
2. 分配一组可靠连接槽,由maxConnections参数定义。这个数字可能是游戏的最大玩家数,也可以分配一些额外的缓存,手工控制进入游戏的人。
3. 创建一个或多个sockets,这个使用socketDescriptors参数描述的变量。
在调用Startup()之前,通常仅可以使用原始UDP功能,包括Ping(),AdvertiseSystem()和SendOutOfBand()。
maxConnections
RakNet预先分配了用于连接其他系统的内存。指定maxConnections作为RakPeerInterface实例和其他实例之间的支持的最大连接数(进来和出去的连接)。注意如果你想要其他的系统连接到你,你需要使用一个等于或小于maxConnections的参数调用SetMaximumIncomingConnections()设置最大的进入连接数。
socketDescriptors参数
在95%情况下,可以如下一样传递参数:
SocketDescriptor(MY_LOCAL_PORT, 0);
对于MY_LOCAL_PORT这个参数,如果运行的是服务器或对等端,你必须设置为想要服务器或对等端运行的端口。这个是将要传递给Connect()的remotePort参数。如果运行的是客户端,你愿意可以设置一个端口,或者设置为0让系统自动选择一个端口。注意在Linux上,想要使用1000以下的值,需要使用管理员的权限。一些端口是保留端口,尽管无法阻止你使用,但是最好不要使用。参考http://www.iana.org/assignments/prot-numbers。
如果愿意,可以创建一组Socket的描述符:
SocketDescriptor sdArray[2];
sdArray[0].port=SERVER_PORT_1;
strcpy(sdArray[0].hostAddress, "192.168.0.1");
sdArray[1].port=SERVER_PORT_2;
strcpy(sdArray[1].hostAddress, "192.168.0.2");
if (rakPeer->Startup( 32, 30, &sdArray, 2 )
OnRakNetStarted();
这个是高级用户想要绑定多个网卡时使用。例如一个网卡连接到LAN后的安全服务器,另外一个网卡连接到因特网。访问不同的绑定组,可以将binding的索引传递给有参数connectionSocketIndex的RakPeerInterface接口的函数。
IPv6是新的因特网协议。代替了传统ip地址例如94.198.81.195,可能使用这样一个IP地址,fe80::7C:31f7:fec4:27de:14。编码使用16字节,而不是4字节,那么IPv6用于游戏效率欠佳。也有积极的一方面,NAT穿透就不再需要了,因为IPv6有足够多的IP地址,不需要创建地址映射,也就不再需要NAT穿透了。
IPv6默认是不可用的。为了支持IPv6,将socket设置为AF_INET6。例如socketDescriptor.socketFamily=AF_INET6;
IPv6的sockets仅仅能够连接到其他的IPv6的sockets。相似地,IPv4(默认)仅能够连接到其他的IPv4的sockets。
threadPriority
对于窗口程序,这个是RakPeer更新线程的优先级,传递给_beginthreadex()。对于Linux,这个参数传递给pthread_attr_setschedparam()用于pthread_create()方法。默认的参数是-99999,在Windows上使用0(NORMAL_PRIORITY),在Linux意味着使用优先权1000。Windows下,默认的参数就不错。而Linux下,可以将这个值设置为正常优先权线程应该设置的值。