python 未接收UDP dgram套接字

0sgqnhkj  于 2022-12-02  发布在  Python
关注(0)|答案(1)|浏览(151)

所以.有一个服务器和一个客户端.客户端根据UDP dgram知道服务器的地址,并向服务器发送数据包.但奇怪的是.数据包似乎要离开,但服务器并不读它们.也就是说,在recv块中,在向客户端发回相互数据包之前,他看不到消息(事先知道他的地址)。然后他才开始看到客户端发来的消息。请告诉我,出了什么问题?(我不用广播,因为服务器和客户端都在一段距离之外)。
程式码范例:

import stun
import socket
import threading

source_ip = "0.0.0.0"
source_port = 9992
external_ip = None
external_port = None
sock = None

def GetIP(ip, port):
    global external_ip, external_port, sock
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((ip, port))
    sock.settimeout(0.1)

    nat_type, nat = stun.get_nat_type(sock, ip, port, stun_host='stun.l.google.com', stun_port=19302)
    if nat['ExternalIP']:
        external_ip = nat['ExternalIP']
        external_port = nat['ExternalPort']
        print("my addr: %s:%s\n" % (external_ip, external_port))
        sock.shutdown(1)
        sock.close()
        return ip, port
    else:
        port += 1
        return GetIP(ip, port)

source_ip, source_port = GetIP(source_ip, source_port)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((source_ip, source_port))

data = None

remote_ip, remote_port = input(
    "input `addr:port` other machine >"
).split(':')
remote_port = int(remote_port)
remote = remote_ip, remote_port

def read_chat(s):
    global data
    while True:
        try:
            data, addr = s.recvfrom(1024)
            print(addr,'>', data)
        except TimeoutError:
            continue

reader = threading.Thread(target=read_chat, args=[sock])
reader.start()

while True:
    line = input(">")
    if ':' in line:
        remote_ip, remote_port = input(
    "input `addr:port` other machine >"
        ).split(':')
        remote_port = int(remote_port)
        remote = remote_ip, remote_port
    else:
        sock.sendto(line.encode(), remote)

两个这样的示例从同一网络启动。还从不同网络启动了两个不同的示例,然后从同一网络启动。Windows系统防火墙已禁用。
尝试不同的插座组合。

hfyxw5xn

hfyxw5xn1#

这一切都是因为NAT。2如果你对这个主题感兴趣,你可以了解绕过NAT的方法。
感谢大家的回复。

相关问题