【发布时间】:2020-05-20 19:00:18
【问题描述】:
您好,我想开发一个项目,将点对点文件从一台计算机传输到另一台计算机,该计算机具有不同的 nat 或不同的 ISP,没有中间服务器(仅允许 Stun 服务器)。尽管我们必须使用 Tcp 进行文件传输,但我只想在 UDP 中尝试一下。
我研究了这篇论文 http://brynosaurus.com/pub/net/p2pnat/ 以了解点对点连接的基本观点,并通过使用 aws ec2 免费层在 UDP 连接中尝试了一些实用的东西。
案例1:(使用python的aws中的socket tcp服务器)
在本地机器的 1234 端口打开了一个 tcp 连接,并在同一台机器的同一端口打开了一个 UDP 连接。 通过与 aws 服务器建立 tcp 连接并保持连接来获取公共 ip 和端口。 然后通过从aws(Ssh连接)的终端复制外部地址来使用sendTo函数。我从本地机器向远程计算机的公共地址发送了一个 UDP 数据包
以下是发送 udp 数据包的代码:
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendTo(b'Message',('publicIp',PublicPort))
结果: 失败,可以接受
案例 2:(socket UDP 服务器使用 python 绑定在 aws 的 1234 端口上)
aws 中的服务器代码会维护已建立连接的列表,因此如果存在超过 2 个连接,它会将已建立连接的列表发送给已建立连接列表中的所有客户端。
所以我在每个连接控制台中都收到了已建立连接的列表。
之后,我使用 udp 连接的公共地址使用 sendTo 函数将数据发送到连接。 下面是发送 udp 数据包的代码:
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendTo(b'Message',('publicIp',PublicPort))
但我在这种情况下也失败了。
在那之后,我认为 udp 连接的 nat 超时,所以我向服务器发送了一个新的 UDP 数据,但我收到了所有连接中已建立连接的列表。
所以 Nat 超时并没有发生,我一定是技术上的错误,因为服务器可以将 udp 数据发送给客户端,而且 udp 连接较少。
所以逻辑必须是,如果我知道与 aws 服务器建立的 udp 连接的公共地址 我可以将 udp 数据发送到该公共地址。
请帮助我理解这个逻辑,我尝试搜索谷歌,但我不知道在谷歌中搜索的关键字。
我曾经在 google 中搜索过的关键字:
udp打孔 tcp打孔 使用pyp2p进行udp打孔
但我找不到解决办法。
【问题讨论】:
标签: python sockets udp p2p stun