所以.有一个服务器和一个客户端.客户端根据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系统防火墙已禁用。
尝试不同的插座组合。
1条答案
按热度按时间hfyxw5xn1#
这一切都是因为NAT。2如果你对这个主题感兴趣,你可以了解绕过NAT的方法。
感谢大家的回复。