"Python简易TCP中继"

2024-07-08 07:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图构建一个简单的TCP中继,它接受多个客户端连接。在

Client1 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client1
Client2 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client2
Client3 --> TCPrelay1 --> RealServer1 --> TCPrelay1 --> Client3

有什么事。对客户数量没有限制


我找到了一个UDP中继脚本here。在

我试着把它改成TCP。我对pythonsockets非常陌生。我的代码有什么问题吗?什么也没发生。它不是中继。在

^{pr2}$

[忽略]
做了一些研究,在另一个问题上发现了这个逻辑:

import select

def fromAtoB(A, B):
    r, w = select.select([A], [B], [])
    if not r: select.select([A], [], [])
    elif not w: select.select([], [B], [])
    B.sendall(A.recv(4096))

但我仍在努力理解如何实现它。在


Tags: 脚本客户端数量客户herenotselecttcp
1条回答
网友
1楼 · 发布于 2024-07-08 07:11:58

您的代码接受一个连接,然后在一个方向上中继一个数据块,然后再也不查看该连接。在

第二段代码有各种各样的问题,但最大的问题是它可能会死锁。在调用B.sendall期间,如果B拒绝读取任何数据,直到它能够完成发送到A(这在您中继的协议中可能是合法的),则您的代理和B将永远等待对方,因为您的代理拒绝从B读取任何数据,直到它完成发送。在

一个合适的继电器必须尝试同时做四件事,而不能等到一件事完成后再开始另一件事。这四件事是:

1)从连接A读取(除非已经备份了大量数据。)

2)从连接B读取(除非已经备份了大量数据)

3)写入连接A。(除非没有从连接B接收到未延迟的数据。)

4)写入连接B。(除非没有从连接A接收到未延迟的数据。)

特别是,您需要两个缓冲区,每个方向一个缓冲区用于未发送的数据。您不能改变方向,因为这将要求您等待其中一个节点接收数据,如果该节点正在等待您接收数据,则可能会死锁。在

通常,实现代理的最简单方法是每个连接有两个线程,每个方向一个线程。在

相关问题 更多 >

    热门问题