我正在尝试编写一些 Python 代码,这些代码将在两个 TCP 套接字之间建立一个不可见的中继。我目前的技术是设置两个线程,每个线程一次读取并随后在特定方向上写入 1kb 数据(即 A 到 B 的 1 个线程,B 到 A 的 1 个线程)。
这适用于某些应用程序和协议,但它并非万无一失——有时特定应用程序在通过这个基于 Python 的中继运行时会表现不同。有的甚至崩溃。
我认为这是因为当我完成对套接字 A 的读取时,在那里运行的程序认为它的数据已经到达 B,而实际上我——中间的狡猾的人——还没有将它发送给 B。在 B 没有准备好接收数据的情况下(因此send()
阻塞了一段时间),我们现在处于 A 认为它已成功向 B 发送数据的状态,但我仍然持有数据,等待send()
调用执行。我认为这是我在使用当前中继代码时在某些应用程序中发现的行为差异的原因。我错过了什么,或者这听起来正确吗?
如果是这样,我真正的问题是:有没有办法解决这个问题?当我们知道 B 准备好接收数据时,是否可以只从套接字 A 读取?或者是否有另一种技术可以用来在 [已经打开并已建立的] TCP 套接字之间建立一个真正“不可见”的双向中继?