【问题标题】:Peer to peer socket communication without port forwarding没有端口转发的点对点套接字通信
【发布时间】:2021-09-03 05:25:12
【问题描述】:

首先我不是在谈论在 vps 或服务器中实现的 tcp 或 udp 或套接字

我的问题就像客户端到客户端的套接字通信。

想象一下在您的家用电脑上使用 tcp 套接字进行监听。无论如何,您都可以从家庭内部网络连接到此。但是假设有人想通过互联网连接到它。然后您可以在路由器上创建转发规则并使其进入工作状态。然后路由器知道如果传入的连接来自一个端口,该连接将被转发到相关内部网络中的设备。 但是我使用的 ISP 不支持端口转发。

我认为这并非不可能,因为有了团队查看器软件。因为当我在团队查看器中连接到朋友时,我打开了wire-shark 并查看了它。 然后我看到数据包是点对点交换的。因为目的源地址是我的ip和朋友的ip 这意味着视频数据的交换无需额外的服务器参与 我强调了团队查看器的连接。 61.245.175.81是我朋友的公网IP。 192.168.1.130是我的内部IP

我也想这样做

这是我的简单套接字代码。这不能通过互联网工作,因为没有路由器转发规则。我对套接字和网络方面很陌生

服务器

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('', 12000))

while True:
    message, address = server_socket.recvfrom(1024)
    message = repr(message)
    print("Connected from ->  " + str(address) )
    print("Received data ->  " + message)
    reply = b"Hi from server :) "
    server_socket.sendto(reply, address)

客户

import time , datetime
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.settimeout(1.0)

message = bytes(str(datetime.datetime.now()),'utf-8')
addr = ("192.168.1.130", 12000)

client_socket.sendto(message, addr)
try:
    data, server = client_socket.recvfrom(1024)
    print( repr(data) )
except: #socket.timeout:
    print('REQUEST TIMED OUT')

谁能解释一下我的问题

【问题讨论】:

  • 如果 A 和 B 想要通信,则 A 和 B 都打开到可以接受传入连接的服务器 C 的连接。所以 A C B.

标签: python sockets networking tcp udp


【解决方案1】:

很确定他们使用UDP hole punching 来实现,您需要做类似的事情来实现它。

简而言之,NAT 后面的两个客户端(这就是你的路由器正在做的事情)可以使用第三个服务器作为一种中介来建立连接。

【讨论】:

  • 非常感谢您的评论。这是非常有用的。但是我找不到正确实现 UDP 打孔的示例。我对此知之甚少。如果其他人有同样的问题,上面的评论和下面的 GitHub 链接会有所帮助。 github.com/dwoz/python-nat-hole-punching 并阅读上述 Github 页面的自述文件。如果有人能解释更多就好了
猜你喜欢
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2016-01-19
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多