[Python] UDP Hole punching in python

Discussão em 'Python' iniciado por Stack, Agosto 31, 2025.

  1. Stack

    Stack Membro Participativo

    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

    Continue reading...

Compartilhe esta Página