两台计算机之间的通信没有打开端口,使用第三台计算机建立连接
Communication between two computers without opening ports, using a third computer to set up the connection
假设我有一个服务器,有两个客户端连接到它。(通过TCP,但没关系)
我的目标是允许两个客户端之间的直接连接。这是为了允许两个玩家之间的直接语音联系,例如,或任何其他客户端插件,他们可能已经安装了,不需要服务器交互(如玩某种随机游戏两者之间)。服务器可以帮助建立连接。
从duskwuff的回答中,我得到了几个线索:
http://en.wikipedia.org/wiki/STUN描述了一个算法,而
http://en.wikipedia.org/wiki/UDP_hole_punching
从这些,我得到了更多的线索:
http://www.h online.com/security/features/how - skype - co -让-圆-防火墙- 747197. - html
http://nutss.gforge.cis.cornell.edu/stunt.php——使用TCP
随着时间的推移,我肯定可以为我的程序解决一些问题。现在我使用c++和TCP (Qt套接字或Boost套接字),但如果需要,我不介意在C中做UDP并包装它。
对于任何有C和c++经验的程序员来说,这个奖励是存在的,通过链接示例程序,更新的库或任何其他有用的信息,可以提供提示,使这更容易。文件化的、灵活的&工作的c++ TCP实现将是最好的,但我会接受我得到的!
在NAT中打TCP漏洞有时/经常是可能的(这取决于NAT的行为)。这不是一个简单的学习主题,但阅读实用JXTA II中有关NAT遍历的相应章节(可在Scribd上在线获得),以了解要解决的问题的本质。
那么,读这个。它来自于写这个的人:http://nutss.gforge.cis.cornell.edu/stunt.php(你问题中的一个链接)。
我不是C/c++专家,但要解决的问题不是语言特定的。只要能够从代码库访问TCP,就足够了。请记住,实现UDP遍历比TCP更容易。
希望这些技巧对你有帮助。
注::我不知道解决方案的C/c++实现。康奈尔链接中提到的代码已经被作者证实是不可操作的。我试图让它复活,但他告诉我,这完全是为了研究目的而调整的,离生产准备还很远。
我不知道有什么方法可以可靠地通过TCP的防火墙,但是对于UDP流量有一个类似的方法,这是很好的记录:
- http://en.wikipedia.org/wiki/STUN
- http://en.wikipedia.org/wiki/UDP_hole_punching
一些您可能感兴趣或有帮助的项目链接:
- http://sourceforge.net/projects/stun/
- http://udt.sourceforge.net/
- http://www.telehash.org/
您正在寻找用于NAT穿孔的会合服务器:可公开访问的服务器(不在NAT/防火墙后面或它们被正确配置),以帮助NAT/防火墙后面的计算机建立点对点连接。
UDP在NAT冲孔中更受欢迎,因为它比TCP提供更好的结果。可以在这里找到UDP NAT穿孔的清晰和翔实的描述。
如果你需要可靠的通信,你可以使用可靠的UDP协议:
- SCTP (libraries) -标准化的,或
- 许多自定义协议之一,例如RakNet(我使用这个库,它非常成熟,功能丰富,并且有NAT冲孔实现),Enet或许多其他(Q8)
临时端口不会神奇地消除通过服务器进行中继的需要,因为它们仅在通过已知服务端口打开的会话生命周期内有效。基本上,临时端口依赖于服务器会话。
您将需要使用服务器来中继两个客户机之间的通信,即充当代理服务器。一种选择是通过SSH代理服务器建立SSH隧道,这样可以增加安全性。
但这并不能保证防火墙不会阻止连接。这取决于防火墙的类型和配置。大多数充当防火墙的家用路由器在默认情况下会阻止所有传入的连接。这通常没有问题,因为大多数情况下,防火墙后面的计算机只充当客户机,由客户机发起与外部的连接。这种设置是不同的,因为一些限制初始连接只到众所周知的服务端口,如HTTP, HTTPS, FTP, SFTP, SSH等,如果你的代理服务器使用一个非众所周知的服务端口,那么连接将被阻止。
但是防火墙也可以设置为阻止传出流量,这在企业网络中最常见,企业网络甚至不允许直接连接到web服务器,并通过代理服务器路由所有内容,以控制资源使用。
您还可以研究使用UPnP动态打开端口
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 我该如何编码,使计算机知道两个名称条目和三个名称条目之间的区别
- 如何在另一台未安装 Visual Studio 的计算机中使用由 Visual Studio 生成的 dll
- 在另一台计算机中运行 GTKMM 代码时未定义的符号
- Visual Studio 中的套接字 c++ 应用程序无法通过两台计算机之间的以太网连接工作
- CLOCKS_PER_SEC是否意味着每台计算机都会有不同的时间概念
- 2台计算机给出不同的输出
- 将Visual Studio C 构建的中间文件移至另一台计算机
- 为什么我的Glreadpixels程序在另一台计算机中不起作用
- 两台计算机之间的行为不同
- 在另一台计算机MFC C++上不进入while循环
- 两台具有相同 IP 地址的计算机 - 使用套接字的聊天应用程序
- 我可以将TokenPrivileges数组从一台计算机复制到另一台计算机吗
- 从另一台计算机运行opencv可执行文件
- 通过网络直接从另一台计算机的内存中读取文件
- Boost.asio服务器客户端.连接2台计算机
- fwrite在一台计算机上浮动,在另一台计算机中浮动
- 如何将 UDP 消息发送到局域网中的每台计算机
- 在C++中使用 zeromq 将序列化的 Mat 对象发送到另一台计算机
- 两台计算机之间的通信没有打开端口,使用第三台计算机建立连接