我需要将文件发送给路由器后面的用户。我知道如果他在路由器上启用端口转发,我可以通过tcp连接执行此操作。我想避免这种情况,以便让我的应用程序更易于用户使用。所以我一直试图做tcp打孔,这几乎是不可能的。我设法做了udp puch holing。
如果您已经知道什么是udp打孔,那么您可以跳过这一部分:
所以我为了在两个恰好位于路由器后面的用户之间建立连接而做了什么。用户1通过udp协议与具有WAN IP地址的服务器通信。用户2也做同样的事情。好的,现在服务器知道每个用户的远程终点。服务器现在向用户2发送用户1的信息。服务器通知用户1用户2已收到该信息。然后,用户2将包发送到用户1的路由器IP地址。该路由器接收的包被转发给用户1,因为它们来自服务器指定的端口。因此,如果用户2通过服务器指定的端口发送,则用户2发送给用户1的路由器的所有包都将到达用户1。当包裹到达用户1时,这些包裹到达用户2信息。用户1现在也知道如何向两个用户2发送数据。
所以现在我能够在两个恰好位于不同路由器后面的用户之间发送数据。我使用udp协议的原因是因为它在使用c#时类似于tcp。我一直试图用tcp做这个,但我无法让它工作。我正在装箱的这个应用程序是用c#编写的,当用户碰巧在同一台路由器后面时,一切都很好。但我知道我想扩展功能。
所以现在我终于在连接两个不同nat的客户端上迈出了第一步。唯一的问题是我设法做到这一点的唯一方法是使用upd协议。我一直在读,upd不能确保数据的传递,而且数据也可能以不同的顺序接收。
另一个替代方案是使用不同的协议,如ftp,bittorrent ...等。我不知道是否有可能做ftp打孔虽然。
所以简而言之,我只是希望能够启用不同路由器后面的两个对等体,以便能够在服务器的帮助下进行通信。我不想通过ralying进行通信(连接从客户端A到服务器到客户端B),因为有时它很难管理,而且当很多用户使用它时维护起来很昂贵。也许我应该使用不同的协议,如bittorrent库,我没有这样做,因为我没有在互联网上找到一个很好的例子,告诉你如何使用该库。
答案 0 :(得分:5)
http://nutss.gforge.cis.cornell.edu/stunt.php
这是来电者STUNT。
简单遍历UDP通过NAT和TCP(STUNT),它扩展了STUN以包含TCP功能,是一种轻量级协议,允许在NAT后面运行的应用程序确定外部IP和端口绑定属性,包过滤规则和各种通过NAT与TCP连接关联的超时。知道这些参数允许应用程序在两个NAT主机之间建立TCP会话。因此,P2P和其他应用程序可以通过现有的NAT基础设施工作,而不会牺牲TCP的好处。
答案 1 :(得分:0)
UPnP也可能是一种选择。