2013-04-21 105 views
1

OS:CentOS的
的Python 2.4和2.7Python的TCP和UDP代理/中继

我试图建立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

为什么在通过TCP发送之前使用UDP进行探测?为什么不从一开始就使用TCP,并假定没有连接意味着不可用? – 2013-04-21 05:54:25

回答

1

我没有看到任何地方你做任何插座non-blocking。所以任何对recv或recvfrom的调用都会挂起,直到数据被实际接收。

所以,当你进入主循环时,你永远阻止拨打usock.recvfrom(4096)。在你实际收到一个UDP数据包之前,你的代码将不会到达conn.recv(1024)行。

考虑使用非阻塞套接字(使用正确的select/poll语义)。

+0

对不起,我是新的。你是怎样做的?我检查了选择。 – zikdaljin 2013-04-21 12:54:55

+0

ala'u_sock.setblocking(0)'和'c_tcp.setblocking(0)' – selbie 2013-04-22 05:48:40