Skip to main content
 首页 » 编程设计

python之Python 中的数据包队列

2025年05月04日698°冷暖

有什么方法可以在 Python 中将数据包排队到套接字?我一直在寻找类似 libipq 库的东西,但找不到任何等效的东西。

这是我想要完成的:

  1. 在服务器和客户端之间创建 tcp 套接字连接(都在我的控制之下)。
  2. 尝试传输数据(等待连接出现故障——例如,客户端因关闭笔记本电脑而失去连接)
  3. 捕获 SocketException 并坚持 到试图成为的数据 发送同时保留剩余 数据等待(在队列中?)
  4. 进入循环尝试重新连接 (假设成功是 不可避免的)
  5. 成功创建新的socket
  6. 恢复数据传输

有什么建议吗? Twisted 可以做到这一点吗?我需要涉及 pcapy 吗?我应该在 C 中执行此操作(套接字、队列等)并使用 Boost 来制作混合代码吗?

提前致谢。


编辑 1:

回复尼克:

I left out the fact that the data I'll be transmitting will be generalized and unending -- think of this app sitting under an ssh session (i'm not in any way trying to peek into the packets). So, the transmission will be bilateral. I want to be able to go from the office to my home (closing my laptop in between), open the laptop at home and continue in my session seamlessly. (I know SCREEN exists). This might lead you to wonder how it'd work without proxies. It won't, I just haven't explained that design. Blockquote

有了添加的上下文,我还应该说我不必在服务器端捕获 SocketException,因为该机器将(或假定)已修复。当客户端发现它再次连接时,它会重新连接到服务器。

请您参考如下方法:

我建议你实现一个应用程序协议(protocol),这样当客户端接收到数据时,它会向服务器确认它,并为每一位数据分配一个序列号。

然后服务器记录下客户端需要哪个序列号并发送它。如果连接中断,则服务器会重新建立连接。

数据可以以任何你喜欢的方式缓冲,但我会保持简单开始并使用 deque对于获取开始和结束的数据,这可能比 list 更有效。

我可能会创建一个具有序列号属性的 Packet 对象,以及一种将其及其数据序列化和反序列化为字节流的方法(例如使用 netstrings )。然后,您会将这些数据包存储在您的双端队列中。您将从双端队列中弹出数据包,并在收到客户端的确认后发送下一个数据包。

这样的协议(protocol)有很多极端情况,需要超时,而且调试起来通常很烦人。如果您想了解一些想法,可以改天看看 SMTP 服务器的源代码!

至于套接字,您可以使用普通的 python 套接字轻松实现它,然后看看它是如何进行的。如果您计划同时拥有大量客户,那么 Twisted 将是个好主意。