我正在Delphi XE5中开发一个P2P应用程序,它使用PHP远程服务器作为跟踪器来制作客户端套接字列表。如果客户端的NAT决定关闭/阻止它在发送到PHP远程服务器的第一条消息中创建的随机端口,我担心使用 UDP Hole Punching 会在某些时候失败。
所以我要知道如何使用来自客户端的NAT(用Delphi编写)进行更长时间的持久端口配置。我不希望我的用户需要知道如何访问路由器并自己配置端口转发。
我可以这样做并使用服务器来存储没有PHP-P-H的套接字,并确保至少在Delphi的应用程序运行端口时仍将保持打开状态吗?
如果我决定从远程服务器使用UDP打孔,如果没有其他用户可以很快直接连接到用户的本地PC,那么NAT会保持打开端口吗?
如果我用UDP打开该端口,我可以在之后使用TCP吗?
Obs:Delphi XE5编译到Windows 32和Android,所以我需要一个非Windows的解决方案。
答案 0 :(得分:2)
Microsoft有一个用于通过uPNP处理NAT的API,特别是用于分配端口映射。查看IUPnPNAT
接口及其StaticPortMappingCollection
属性。使用IStaticPortMappingCollection.Add
分配NAT中的端口。
当然,这仅适用于打开uPNP的路由器。并非所有路由器都支持uPNP,或者启用了uPNP。