我试过用这个理论实现UDP打孔:
客户端(A)和客户端(B)可以在UDP上访问集合点服务器(S)。 客户端A和B分别向S发送注册包.S读取公共IP和外部端口并存储它。 S将A-info(endPointA)发送到B,将B-info(endPointB)发送给A. 有了这些信息,A可以发送到B的终点,B可以发送到A的终点。
服务器S是python 3,客户端A和B是C#
到目前为止的理论。这是有效的:
以下是不起作用的:
最后一个限制让我觉得路由器上有一些“锁定”只允许S上的原始套接字发送给客户端(?)
所以我的问题是:现在怎么办?
是否有一些套接字选项,套接字标志,套接字需要设置什么来解决这个问题?
我甚至尝试在服务器S上创建一个脚本,该脚本在32000-65535的所有端口上向客户端发送公共IP,但没有消息通过。
服务器代码:
IMP
客户代码:
def ServerUdpStart(host, port):
"""Start up the server"""
global myServerUdp
success = True
try :
myServerUdp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error as msg:
print('UDP Failed to create socket. Error Code:', str(msg[0]), 'Message', msg[1])
success = False
# Bind socket to local host and port
try:
myServerUdp.bind( (host, port) )
except socket.error as msg:
print('UDP bind failed. Error Code : ', str(msg[0]), 'Message', msg[1])
success = False
return success
def ServerUdpReceiveData():
"""Incoming UDP data (runs in a thread)"""
global myServerUdp
if myServerUdp != None:
d = myServerUdp.recvfrom(1024)
data = d[0]
addr = d[1] # source tuple (ip, port) to store for clients
if data:
incomingUdpMessage(addr, data) # handle incoming data