Python TCP & UDP 代理/中继

标签 python linux sockets

操作系统: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 TCP & UDP 代理/中继,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127260/

相关文章:

c - Linux : When sending Ethernet frames the ethertype is being re-written

带有停止/启动选项的 Linux bash 脚本

python - python 套接字拒绝连接

node.js - "Error: socket hang up"与 express

python - 在 Python 中指示 group_id 时,Kafka 未收到消息

python - 仅通过配置文件进行身份验证?

python - 将 TCL 脚本的输出记录到 Tkinter 文本小部件中

python - 如何使用 split 函数在 python 中拆分单个列表的子列表?

php - Jquery .change 函数使用复选框多次触发

c++ - 如何使用 select 将数据从服务器发送到客户端