操作系统:CentOS
Python:2.4和2.7

我正在尝试为应用程序的TCP和UDP通信量构建中继或代理。
我的设置是app1,通过不断发送UDP数据包来验证app2是否在线。
一旦app1确认app2处于在线状态,它将通过TCP协议(protocol)发送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并非如此。
有什么事吗

最佳答案

我看不到您在哪里创建任何套接字non-blocking的地方。因此,对recv或recvfrom的任何调用都将挂起,直到实际接收到数据为止。

因此,当您进入主循环时,将永远阻止usock.recvfrom(4096)的调用。在您实际收到UDP数据包之前,您的代码将不会进入conn.recv(1024)行。

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

关于python - Python TCP和UDP代理/中继,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16127260/

10-16 21:39