我想在C#中编写类似聊天程序的点对点代码。我试图找出网络如何工作。我知道这个概念是每个对等体同时是一个客户端和一个服务器。它可以连接和连接。但我的问题是,如何在没有端口转发到该计算机的情况下连接到路由器后面的计算机?我知道像Bittorrent这样的事情没有问题。我计划使用跟踪器来保存对等列表和他们监听的端口,但我仍然不明白如何解决路由器问题。有人可以解释一下吗?
答案 0 :(得分:4)
你是对的,这不是微不足道的。问题是称为NAT,或 network address translation 。从本质上讲,您在自己的本地网络中拥有的IP是唯一的,但在更广泛的公共Internet环境中,同一路由器后面的许多人将具有相同的公共IP。因此,给定一个IP和一些数据,你不一定能告诉另一端的哪个人应该得到它。
最有效和最简单的解决方案是让第三方通过插入数据流来调解连接。而不是聊天中的每个人同时是“客户”和“服务器”,只有一个服务器,它位于一个众所周知的公共场所;然后每个人都联系到它。然后,服务器管理通信并在人们聊天时向他们发送消息。
但是还有其他解决方案。例如,您可以使用众所周知的端口来代替使用众所周知的服务器:所有通信都在此端口上进行。然后您不需要服务器,但所有端点都需要打开该端口,这需要事先进行配置。
答案 1 :(得分:3)
除了John Feminella的回答,您可以考虑使用许多消费者网络设备支持的UPNP服务。
答案 2 :(得分:3)
我假设您的意思是在NAT环境中,如果是这样,请阅读并理解Peer-to-Peer Communication Across Network Address Translators (Ford, Srisuresh & Kegel。
关键概念是每个客户端必须启动一个连接,该连接将打开NAT设备的路径。参考Pidgin source code获取一些想法可能很有用。