我们正试图让两个程序以类似游戏的方式相互通信。它们与中央服务器保持TCP连接以获得“控制”类型信息,中央服务器确保两个客户端都接收到该信息。然后,两个客户端使用sendto()和recvfrom()与udp服务器通信,后者只是将收到的信息发送给连接的其他客户端。
现在问题是,如果你有一个家庭路由器或私人办公室网络,udp服务器sendto()到另一个客户端将被防火墙过滤掉,除非你打开了一个端口,这是更多的方式比我们希望客户做的更多。
但我不想失去UDP的好处 - 我不关心数据包丢失和秩序。我愿意自己管理所有这些。
那么,我可以可靠地创建一个读写连接的UDP套接字吗?我记得在过去尝试过这个问题,并且遇到了很多问题,我放弃了并转到sendto() - recvfrom()解决方案,然后才意识到我只是把自己搞砸了我们的私人网络。
有关如何处理此问题的任何建议?对于连接的UDP套接字,我应该特别注意哪些最佳实践或事项?它真的可行吗?
(我在纯C中对此进行编码)。
答案 0 :(得分:1)
我相信这是UPnP的目的。 TCP穿越NAT的原因是,第3层设备很容易将入站数据包与先前通过出站连接建立的活动TCP会话相关联。 IIRC,UPnP解决了与UDP层相同的问题,但它确实需要路由器的支持,因此它可能无法与旧的或配置不当的网络设备一起使用。
我不知道应用程序员有任何有趣的细节,但希望这可以指出你正确的方向。
答案 1 :(得分:0)
Minupnpd http://miniupnp.free.fr/附带了一个可以使用UPnP和NAT-PmP的库,它可以让你从很多国内路由器中出来。您也可以像XBox和PS-3那样做,如果在盒子上启用它们,则使用Teredo和/或IPv6;当UPnP和NAT-PmP都无法到达任何地方时,这些有时会起作用。
然后是另一种方法,称为ICE,并使用称为STUN和TURN的协议组合。这里的图书馆:http://www.pjsip.org/pjnath/docs/html/
如果某个站点的边界路由器无法使用这七种解决方案中的一种(UPnP,NAT-PmP,Teredo,IPv6,ICE,STUN和TURN),则它可能完全被破坏或被故意锁定。