RakNet是RakkarSoft的一个网络引擎(http://www.rakkarsoft.com/) 。该引擎有商业版和非商业版之分,非商业版意味着免费,同时也意味着代码质量不会很高,因为它不可能傻到把免费版做来比商业版要好。虽然2.454版本的文档明确了可以使用完成端口(注意:RakNet后续版本都不再支持完成端口),但是在实际代码中,完成端口部分的代码却不能工作。由于项目需要,我对其进行了修复。
下面是在修改过程中对RakNet连接过程及错误的简要分析:
下图展示了利用RakNet提供的C/S聊天程序进行连接的过程。无论是否采用完成端口,该过程都是相同的。
下图为状态转换图,清晰地显示了创建连接的全过程。
在RakNet 2.454版本中,完成端口不能正常工作主要原因如下:
1、 将加密套接字与完成端口绑定的时机不对。从连接图我们可以看出客户端最好的时机是在客户端收到ID_CONNECTION_REQUEST_ACCEPTED,服务器最好的时机为在收到ID_NEW_INCOMING_CONNECTION的时候。
2、