IPv4

VPS 服务端

直接复制运行:

python3 - <<'PY'
import socket

HOST = "0.0.0.0"
PORT = 50589

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((HOST, PORT))

print(f"UDP IPv4 server listening on {HOST}:{PORT}")

while True:
    data, addr = sock.recvfrom(65535)
    print(f"received from {addr}: {data!r}", flush=True)
    sock.sendto(b"UDP IPv4 OK", addr)
PY

Mac 客户端

把 VPS_IPV4 换成 VPS 的 IPv4:

python3 - <<'PY'
import socket

server = ("VPS_IPV4", 50589)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.settimeout(5)

message = b"hello from mac"

print(f"Sending UDP packet to {server}...")
sock.sendto(message, server)

try:
    data, addr = sock.recvfrom(4096)
    print(f"UDP response received from {addr}:")
    print(data.decode(errors="replace"))
except socket.timeout:
    print("UDP TIMEOUT: VPS did not respond")

sock.close()
PY

收到:

UDP response received from ('VPS_IPV4', 50589):
UDP IPv4 OK

说明 IPv4 UDP 入站正常。


IPv6

VPS 服务端

直接复制运行:

python3 - <<'PY'
import socket

HOST = "::"
PORT = 50589

sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.bind((HOST, PORT))

print(f"UDP IPv6 server listening on [{HOST}]:{PORT}")

while True:
    data, addr = sock.recvfrom(65535)
    print(f"received from {addr}: {data!r}", flush=True)
    sock.sendto(b"UDP IPv6 OK", addr)
PY

Mac 客户端

把 VPS_IPV6 换成 VPS 的 IPv6:

python3 - <<'PY'
import socket

server = ("VPS_IPV6", 50589)

sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.settimeout(5)

message = b"hello from mac"

print(f"Sending UDP packet to [{server[0]}]:{server[1]}...")
sock.sendto(message, server)

try:
    data, addr = sock.recvfrom(4096)
    print(f"UDP response received from [{addr[0]}]:{addr[1]}")
    print(data.decode(errors="replace"))
except socket.timeout:
    print("UDP TIMEOUT: VPS did not respond")

sock.close()
PY

例如:

2406:ef80:4:2881::858a:bbb7

直接填写:

server = ("2406:ef80:4:2881::858a:bbb7", 50589)

不要写成:

server = ("2406\:ef80:4:2881::858a\:bbb7", 50589)

检查监听状态

VPS 上执行:

ss -lunp | grep 50589

IPv4 应看到:

0.0.0.0:50589

IPv6 应看到:

[::]:50589

如果客户端超时,可以进一步抓包:

tcpdump -ni any udp port 50589

然后重新从 Mac 发送 UDP 数据。

::