2013-04-21 104 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