Python中的数据包队列?

2 投票
1 回答
1707 浏览
提问于 2025-04-15 16:21

有没有办法在Python中给一个socket排队发送数据包?我一直在找类似于libipq的库,但找不到等效的东西。

我想实现的目标是:

  1. 在服务器和客户端之间建立一个TCP socket连接(这两个我都能控制)。
  2. 尝试发送数据(等待连接出现故障,比如客户端因为关掉笔记本而失去连接)。
  3. 捕捉到SocketException后,保存那些正在尝试发送的数据,同时让其他数据保持等待(放在一个队列里?)
  4. 进入一个循环,尝试重新连接(假设成功是必然的)。
  5. 成功后创建一个新的socket。
  6. 继续发送数据。

有什么建议吗?Twisted可以做到这一点吗?我需要用到pcapy吗?我是否应该在C语言中处理这些(socket、队列等),然后用Boost来做混合代码?

提前谢谢你。


编辑 1:

对Nick的回复:

我漏掉了一个事实,就是我将要传输的数据是通用的且是无尽的——可以想象这个应用在一个ssh会话下运行(我并不是想窥探数据包)。所以,传输是双向的。我希望能够从办公室回到家(中间关掉笔记本),在家打开笔记本后无缝继续我的会话。(我知道有SCREEN这个工具)。这可能会让你想知道没有代理的情况下怎么实现。其实是不能的,我只是没有解释这个设计。

有了这些额外的背景,我还想说,我不需要在服务器端捕捉SocketException,因为那台机器是固定的(或者可以假设是固定的)。当客户端发现它又能连接时,它会直接重新连接到服务器。

1 个回答

0

我建议你实现一个应用协议,这样当客户端收到数据时,它会向服务器确认,并附上每条数据的序列号。

服务器会记录客户端需要下一个序列号的数据,并将其发送过去。如果连接中断,服务器会重新建立连接。

数据的缓存方式可以随你喜欢,但我建议一开始保持简单,使用一个deque,因为它在从头和尾取数据时比list更高效。

我可能会创建一个Packet对象,它有一个序列号属性,并且有方法可以将它和它的数据序列化(转换成字节流)和反序列化(从字节流恢复)。比如可以使用netstrings。然后你可以把这些Packet存储在你的deque里。当你从deque中取出一个packet,并收到客户端的确认后,就可以发送下一个。

这样的协议有很多边界情况,需要设置超时,调试起来通常也很麻烦。如果你想了解更多,可以看看某个SMTP服务器的源代码!

至于套接字,你可以很容易地用普通的Python套接字来实现这个,看看效果如何。如果你打算同时处理很多客户端,使用twisted会是个不错的选择。

撰写回答