SystemAddress是什么?
SystemAddress是包含了网络上系统的二进制的IP地址和端口的结构体。结构体在RakNetTypes.h中定义。在一些情况下需要使用SystemAddress,例如:
1. 服务器从一个特殊的客户端获取一个消息,想要中继(转发)给所有的其他客户端。你需要在Send函数中指定发送者的SystemAddress(在RakNet::systemAddress域中给出),并且将广播设置为true(就是在Send函数中将广播标志设置为true,将不转发的客户端指定为发送者的SystemAddress)。在游戏世界的一些项目,例如地雷,属于一个特定玩家,这个地雷杀死人之后也会给放置者分数。
2. 在一个端到端的网络上要发送一个消息到任何的端。
功能函数:
ToString() – 指定一个系统地址结构体,返回一个点分的IP地址
FromString – 指定一个点分的IP地址,填充结构体的binaryAddress部分
重要的注意点:
1. 数据包的接受方会自己知道发送数据包的系统的SystemAddress,因为它可以从发送者的IP/Port结合体中来获得这个值。如果仅仅需要服务器知道SystemAddress是什么,那么发送者不需要将它自己的SystemAddress编码到数据包中。原始发送者的SystemAddress在数据包结构体中自动传递给编程人员,Receive会返回它!
2. 当使用客户端/服务器模型时,客户端不知道发送数据包的原始发送者的SystemAddress。只要客户端连接了服务器,所有的数据包都来自服务器。因此如果客户端需要知道另外一个客户端的SystemAddress,则要将数据包中加入一个SystemAddress数据结构。可以让发送客户端填充这个数据域,或者也可以让服务器从原始发送者那里接收到数据包时来填充这个数据结构体。
3. 在连接期间一个特定的RakPeer实例的系统地址不会发生变化,Router2插件除外。然而并不是所有的系统都是这样的(例如在对称的NAT后面的系统就不是这样的情况)。需要一个唯一的标识符,因为在数据包结构体重有一个唯一的标识符,例如rakNetGUID。RakPeerInterface 有一些函数来操作RakNetGUID。
4. 通过RakNetGUID来指向远端系统是非常好的方法,而SystemAddress则不是特别好的选择。RakNetGUID对于一个RakPeer实例来说是唯一的,然后SystemAddress却不一定是唯一的。如果在系统中要使用Router2插件,唯一地使用RakNetGUID很有必要。
By 北洋小郭