python / C#UDP打孔

时间:2017-10-25 12:28:52

标签: c# python sockets udp

我试过用这个理论实现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可以在公共端点上向A和B发送尽可能多的消息。
  • A和B可以在innerIP:localPort上相互发送,如果他们只在同一个路由器后面!

以下是不起作用的:

  • A不能使用他们的公共endPointA / endPointB
  • 发送到B或B到A.
  • 即使我在服务器S上创建了一个新套接字,也无法通过这些endPoints获取消息

最后一个限制让我觉得路由器上有一些“锁定”只允许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

0 个答案:

没有答案