我正在尝试为我的应用程序构建TCP和UDP流量的中继或代理 我的设置是app1通过不断发送UDP数据包来验证app2是否在线 一旦app1验证app2在线,它就会通过TCP协议发送app2数据包。
到目前为止,这是我的代码:
#-------------------------------------
#SOCK_DGRAM --UDP
u_localPort = 20006
u_remotePort = 20006
u_remoteHost = "x.x.x.x"
u_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
u_sock.bind(('', u_localPort))
u_knownClient = None
u_knownServer = (u_remoteHost, u_remotePort)
#-------------------------------------
#-------------------------------------
#SOCK_STREAM --TCP
t_localPort = 10006
t_remotePort = 10006
t_remoteHost = "x.x.x.x"
#client
c_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c_tcp.connect((t_remoteHost, t_remotePort))
#server
s_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_tcp.bind(('', u_localPort))
s_tcp.listen(1)
conn, addr = s_tcp.accept()
#-------------------------------------
while True:
u_data, u_addr = u_sock.recvfrom(4096)
if u_knownClient is None:
u_knownClient = u_addr
if u_addr == u_knownClient:
u_sock.sendto(u_data, u_knownServer)
else:
u_sock.sendto(u_data, u_knownClient)
data = conn.recv(1024)
if not data: break
print "received data:", data
c_tcp.send(data) # echo
使用此代码,UDP数据似乎正在正确中继。但TCP不是。 可能有什么不对?
答案 0 :(得分:1)
我没有看到你在哪里制作任何套接字non-blocking。因此,对recv或recvfrom的任何调用都会挂起,直到实际收到数据为止。
因此,当您进入主循环时,您将永远阻止对usock.recvfrom(4096)
的调用。在您实际收到UDP数据包之前,您的代码将无法进入conn.recv(1024)
行。
考虑使用非阻塞套接字(具有正确的select/poll语义)。