gpt4 book ai didi

Python TCP & UDP 代理/中继

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:57 26 4
gpt4 key购买 nike

操作系统: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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com