此主题类似于this thread
我对网络编程的主题比较陌生,在单个本地计算机上从未做过基本的TCP / UDP。现在我正在开发一个需要P2P网络支持的应用程序。更具体地说,我将需要应用程序在互联网上连接和通信,最好不使用服务器来进行客户端之间的匹配。
我知道并假设几乎所有用户都在路由器后面,这使得流程变得复杂,因为两个客户端都无法初始化到另一个的直接连接。
我知道UPnP是允许端口转发的选项,无需用户手动配置,但截至目前,这不是一个选项。他们有没有办法实现我的目标,还是我需要那台服务器?
答案 0 :(得分:6)
为你做的非常好的阅读:-),是RFC 5128, "State of Peer-to-Peer (P2P) Communication across Network Address Translators (NATs)"。
答案 1 :(得分:5)
您需要一台服务器来交换IP地址等。正如另一个线程字面上指出的那样,保证连接的唯一方法是通过服务器进行代理。大多数对等系统使用 UPnP 和 NAT Hole Punching (此方法需要服务器中继端口信息,仅适用于UDP)在大多数情况下建立连接。
NAT Hole Punching 由建立与服务器连接的客户端工作,然后两者都尝试直接连接到另一个已转发给另一个端口的端口。大多数UDP NAT会在短时间内记住IP地址和端口,因此虽然数据永远不会到达另一端(不是这对UDP很重要),但是其他客户端会尝试稍后连接到该报告作为NAT期待回复。
答案 2 :(得分:3)
使用WCF查看P2P频道:http://msdn.microsoft.com/en-us/library/cc297274.aspx
效果很好。
答案 3 :(得分:2)
忽略UPnP(不幸的是,它只适用于某些路由器),而且没有中央服务器,我不确定当两个用户都在NAT后面时可以创建直接连接。
答案 4 :(得分:1)
为了避免服务器“匹配”,你可以做skype做的事情,并设置一些对等体作为NAT后面的其他人的中继。您将始终需要某种引导捆绑机制,因此集中式服务器可能会以某种方式进入您的系统(当然,取决于您的开发)。