IPv6支持以及与IPv4的不同
IPv6是下一代使用的IP地址。由于可用的IPv4地址已经用尽,需要开发具有更大地址空间的IPv6。整个网络工业会逐渐转向使用IPv6,因此有必要使RakNet支持IPv6以满足将来的应用。
IPv4使用4字节代表IP地址,使用符号表示就是127.0.0.1。IPv6使用16字节,使用如下的标记形式:fe80::7c:31f7:fec4:27de。将RakNetDefines.h中的RAKNET_SUPPORT_IPV6设置为1,这个设置是默认的,对IPv6的支持将编译进RakNet。
IPv4的环回地址是127.0.0.1。IPv6的环回地址是::1。IPv4的广播地址是255.255.255.255。IPv6不支持广播。如果将路由设置为不支持多播,那么IPv6也不支持多播。IPv6中没有默认的多播地址,如果终端用户不进行手动设置,LANServerDiscovery插件将不能使用。
使用了IPv6,NAT穿透也没有必要使用了。假设你知道系统的IP地址,由于不存在NAT,每一个主机都有自己唯一的IP地址,即使这个系统处于路由之后,你也可以直接连接到该系统上。
IPv4 sockets/ IP 地址不能连接到IPv6 sockets/IP地址,反过来也一样,IPv6也无法连接IPv4。
如果一个socket使用IPv4,一个socket使用IPv6,那么在同一个端口上启动两个socket也是可以的。下面代码片段说明如何实现。
支持IPv6
这一段代码来自于ChatExampleServer工程。如果可能的话,它启动了两个socket,第二个socket支持IPv6。并不是所有的操作系统默认支持IPv6,或有些系统更本就不支持IPv6,因此退一步来说使用IPv4还是很有必要的。
RakNet::SocketDescriptor socketDescriptors[2];
socketDescriptors[0].port=atoi(portstring);
socketDescriptors[0].socketFamily=AF_INET; // Test out IPV4
socketDescriptors[1].port=atoi(portstring);
socketDescriptors[1].socketFamily=AF_INET6; // Test out IPV6
bool b = server->Startup(4, socketDescriptors, 2 )==RakNet::RAKNET_STARTED;
server->SetMaximumIncomingConnections(4);
if (!b)
{
printf("Failed to start dual IPV4 and IPV6 ports. Trying IPV4 only.\n");
// Try again, but leave out IPV6
b = server->Startup(4, socketDescriptors, 1 )==RakNet::RAKNET_STARTED;
if (!b)
{
puts("Server failed to start. Terminating.");
exit(1);
}
}
正如上述代码所示,要想使用IPv6就要设置SocketDescriptor的socketFamily成员的值为AF_INET6。默认值为AF_INET,这个值是使用IPv4所需要使用的值。
注:在写本篇文档时,RakNet的控制台还不支持IPv6。