flu*_*es1 4 python sockets tcp portforwarding
我正在尝试编写一些Python代码,它将在两个TCP套接字之间建立一个不可见的中继.我目前的技术是设置两个线程,每个线程读取并随后在特定方向上一次写入1kb数据(即A到B的1个线程,B到A的1个线程).
这适用于某些应用程序和协议,但它并非万无一失 - 有时特定应用程序在运行此基于Python的中继时的行为会有所不同.有些甚至崩溃.
我认为这是因为当我完成对套接字A的读取时,在那里运行的程序认为它的数据已经到达B,而实际上我 - 中间的狡猾的人 - 尚未将它发送给B.在B未准备好接收数据的情况下(暂时send()阻塞了一段时间),我们现在处于A认为已成功向B发送数据的状态,但我仍然保持数据,等待send()呼叫执行.我认为这是我在某些应用程序中发现的行为差异的原因,同时使用我当前的中继代码.我错过了什么,或听起来是否正确?
如果是这样,我真正的问题是:有没有解决这个问题的方法?当我们知道B准备好接收数据时,是否可以只读取套接字A?或者是否有另一种技术可用于在[已经打开和建立的] TCP套接字之间建立真正"隐形"的双向中继?
当我们知道B准备好接收数据时,是否可以只读取套接字A?
当然:在套接字A和B上使用select.select(如果它返回说只有其中一个已经准备就绪,在另一个套接字上使用它),并且只有当你知道它们都准备就绪时才从A读取并写入B. 例如:
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3282 次 |
| 最近记录: |