python中的UDP打洞

发布于 2025-01-10 14:51:04 字数 3135 浏览 0 评论 0原文

我正在尝试使用 UDP 打洞建立点对点通信。我首先与服务器建立连接,然后尝试在 2 个客户端之间进行通信,但我无法在 2 个不同 NAT 后面的 2 台计算机之间进行通信,因为我不明白必须输入什么 IP 地址和端口建立通讯。 请告诉我必须对下面的代码进行哪些更改才能使两台计算机能够通信。

PS:外部IP似乎不起作用,我不应该使用任何其他工具,例如ngrok

Server.py

import socket
import struct
import sys

server_listening_port = 12345

sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sockfd.bind(("", server_listening_port))
print("Listening on the port " + str(server_listening_port))

client_requests = []

while True:
    data, addr = sockfd.recvfrom(32)
    client_requests.append(addr)
    print("Connection from: " + str(addr))

    if len(client_requests) == 2:
        break

client_a_ip = client_requests[0][0]
client_a_port = client_requests[0][1]
client_b_ip = client_requests[1][0]
client_b_port = client_requests[1][1]

message = ": "

sockfd.sendto(str(client_a_ip).encode("utf-8") + message.encode("utf-8") + str(client_a_port).encode("utf-8"), client_requests[1])
sockfd.sendto(str(client_b_ip).encode("utf-8") + message.encode("utf-8") + str(client_b_port).encode("utf-8"), client_requests[0])
sockfd.close()

上面是集合服务器

ClientA.py

import socket
import struct
import sys
import time
master = ("Server_IP", Port)

#Create dgram udp socket
try:
    sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    message = "Hello"
    sockfd.bind(('', 0))
    sockfd.sendto(message.encode("utf-8"), master)

except socket.error:
    print("Failed to create socket")
    sys.exit()

# #Receiving peer info from server
peer_data, addr = sockfd.recvfrom(1024)
print (peer_data)

print("trying to communicate with peer")
peer_ip = peer_data.decode("utf-8").split(":")[0]
peer_port = int(peer_data.decode("utf-8").split(":")[1])

peer = (peer_ip, peer_port)

while 1:
    message1 = input(str("You:>>"))
    message = message.encode("utf-8")
    sockfd.sendto(str(message).encode("utf-8"), peer)
    incoming_msg, sendaddr = sockfd.recvfrom(1024)
    incoming_msg = incoming_msg.decode("utf-8")
    print("ClientB:>>",incoming_msg)

上面的代码是客户端A

ClientB.py

import socket  #For sockets
import struct
import sys    #For exit
import time
master = ("Server_IP", port)
me = ("ClientB_IP", port)

#Create dgram udp socket
try:
    sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    message = "Hello"
    sockfd.bind(('', 0))
    sockfd.sendto(message.encode("utf-8"), master)

except socket.error:
    print("Failed to create socket")
    sys.exit()

# #Receiving peer info from server
peer_data, addr = sockfd.recvfrom(1024)
print (peer_data)

print("trying to communicate with peer")
peer_ip = peer_data.decode("utf-8").split(":")[0]
peer_port = int(peer_data.decode("utf-8").split(":")[1])
peer = (peer_ip, peer_port)

while 1:
    incoming_msg, sendaddr = sockfd.recvfrom(1024)
    incoming_msg = incoming_msg.decode("utf-8")
    print("ClientA:>>", incoming_msg)
    message = input(str("You :>>"))
    message = message.encode("utf-8")
    sockfd.sendto(str(message).encode("utf-8"), peer)

上面是客户端B

我只面临IP地址和端口的问题。所以,请帮助我在2个不同NAT后面的2台计算机之间建立通信

I am trying to establish a peer to peer communication using UDP hole punching. I am first establishing a connection with the server and then trying to make communication between 2 clients, but I am not able to communicate between 2 computers that are behind 2 different NATs as I am not understanding what IP address and port must I enter for the establishment of communication.
Please tell me what changes must I make in the code below so that 2 computers are able to communicate.

P.S : External IP doesn't seem to work and I am not supposed to use any additional tool like ngrok

Server.py

import socket
import struct
import sys

server_listening_port = 12345

sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sockfd.bind(("", server_listening_port))
print("Listening on the port " + str(server_listening_port))

client_requests = []

while True:
    data, addr = sockfd.recvfrom(32)
    client_requests.append(addr)
    print("Connection from: " + str(addr))

    if len(client_requests) == 2:
        break

client_a_ip = client_requests[0][0]
client_a_port = client_requests[0][1]
client_b_ip = client_requests[1][0]
client_b_port = client_requests[1][1]

message = ": "

sockfd.sendto(str(client_a_ip).encode("utf-8") + message.encode("utf-8") + str(client_a_port).encode("utf-8"), client_requests[1])
sockfd.sendto(str(client_b_ip).encode("utf-8") + message.encode("utf-8") + str(client_b_port).encode("utf-8"), client_requests[0])
sockfd.close()

Above is the rendezvous server

ClientA.py

import socket
import struct
import sys
import time
master = ("Server_IP", Port)

#Create dgram udp socket
try:
    sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    message = "Hello"
    sockfd.bind(('', 0))
    sockfd.sendto(message.encode("utf-8"), master)

except socket.error:
    print("Failed to create socket")
    sys.exit()

# #Receiving peer info from server
peer_data, addr = sockfd.recvfrom(1024)
print (peer_data)

print("trying to communicate with peer")
peer_ip = peer_data.decode("utf-8").split(":")[0]
peer_port = int(peer_data.decode("utf-8").split(":")[1])

peer = (peer_ip, peer_port)

while 1:
    message1 = input(str("You:>>"))
    message = message.encode("utf-8")
    sockfd.sendto(str(message).encode("utf-8"), peer)
    incoming_msg, sendaddr = sockfd.recvfrom(1024)
    incoming_msg = incoming_msg.decode("utf-8")
    print("ClientB:>>",incoming_msg)

Above code is Client A

ClientB.py

import socket  #For sockets
import struct
import sys    #For exit
import time
master = ("Server_IP", port)
me = ("ClientB_IP", port)

#Create dgram udp socket
try:
    sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    message = "Hello"
    sockfd.bind(('', 0))
    sockfd.sendto(message.encode("utf-8"), master)

except socket.error:
    print("Failed to create socket")
    sys.exit()

# #Receiving peer info from server
peer_data, addr = sockfd.recvfrom(1024)
print (peer_data)

print("trying to communicate with peer")
peer_ip = peer_data.decode("utf-8").split(":")[0]
peer_port = int(peer_data.decode("utf-8").split(":")[1])
peer = (peer_ip, peer_port)

while 1:
    incoming_msg, sendaddr = sockfd.recvfrom(1024)
    incoming_msg = incoming_msg.decode("utf-8")
    print("ClientA:>>", incoming_msg)
    message = input(str("You :>>"))
    message = message.encode("utf-8")
    sockfd.sendto(str(message).encode("utf-8"), peer)

Above is client B

I am facing problem only in the IP address and port. So , please do help me with it to establish communication between 2 computers behind 2 different NATs

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如梦初醒的夏天 2025-01-17 14:51:04

我目前遇到同样的问题,我想自己编程。经过一些研究,我发现了一篇非常好的论文,详细解释了这个过程。
如果我成功了,我会告诉你。
https://bford.info/pub/net/p2pnat/

I'm currently on the same problem and I want to program it for myself. With some research I found a really good paper explaining the process in detail.
I let you know if I succeed.
https://bford.info/pub/net/p2pnat/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文