2

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

这是我要完成的工作:

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

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

提前致谢。


编辑1:

对尼克的回应:

我忽略了我将要传输的数据将是泛化且无止境的这一事实——想想这个应用程序位于 ssh 会话下(我不会以任何方式试图窥探数据包)。因此,传输将是双边的。我希望能够从办公室到我家(在两者之间关闭我的笔记本电脑),在家中打开笔记本电脑并无缝地继续我的会话。(我知道屏幕存在)。这可能会让你想知道没有代理它是如何工作的。它不会,我只是没有解释那个设计。块引用

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

4

1 回答 1

0

我建议你实现一个应用程序协议,所以当客户端收到数据时,它会向服务器确认它,并为每一位数据提供一个序列号。

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

无论如何,数据都可以被缓冲,但我会保持简单,开始使用双端队列可能比list获取开始和结束的数据更有效。

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

这样的协议有很多极端情况,需要超时并且通常调试起来很烦人。如果你想知道的话,总有一天可以查看 SMTP 服务器的源代码!

至于套接字,您可以使用普通的 python 套接字轻松实现它,看看它是如何进行的。如果您打算一次拥有很多客户,那么扭曲将是一个好主意。

于 2009-11-24T21:35:39.697 回答