2013-04-21 2 views
1

OS : CentOS는
파이썬 : 2.4 및 2.7파이썬 TCP 및 UDP 프록시/릴레이

내 응용 프로그램을 모두 TCP 및 UDP 트래픽을위한 릴레이 또는 프록시 구축을 위해 노력하고있다.
내 설정은 app1이 지속적으로 UDP 패킷을 보내서 app2가 온라인인지 확인합니다.
app1이 app2가 온라인 상태인지 확인하면 TCP 프로토콜을 통해 app2 데이터 패킷을 보냅니다.

이 지금까지 내 코드는 다음 UDP 데이터가 제대로 중계 될 것으로 보인다 코드와

#------------------------------------- 
#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 

. 그러나 TCP는 그렇지 않습니다. 무엇이 잘못 될 수 있습니까?

+0

왜 TCP를 통해 전송하기 전에 UDP로 프로브합니까? 왜 처음부터 TCP를 사용하지 않고 연결이 없다고 가정하지 않을까요? –

답변

1

소켓을 만드는 곳 어디에도 보이지 않습니다. non-blocking. 따라서 recv 또는 recvfrom에 대한 모든 호출은 데이터가 실제로 수신 될 때까지 중단됩니다.

그래서 주 루프로 들어갈 때 usock.recvfrom(4096)으로 전화하면 영원히 차단됩니다. 실제로 UDP 패킷을 수신 할 때까지는 코드가 conn.recv(1024) 행이되지 않습니다.

논 블로킹 소켓 (적절한 select/poll 의미론 포함) 사용을 고려하십시오.

+0

죄송합니다. 어떻게 그걸합니까? 선택을 확인했습니다. – zikdaljin

+0

ala'u_sock.setblocking (0)'과'c_tcp.setblocking (0)' – selbie