【问题标题】:Implementing a TLV protocol via TCP通过 TCP 实现 TLV 协议
【发布时间】:2011-12-17 22:45:01
【问题描述】:

我目前正在尝试实现一个 (T)LV 协议以在 TCP 之上使用。这个协议的一个非常早期的版本是通过每个 send-recv 对发送一条消息来构建的。 (即发送(“要传输的消息”-recv(...))。这在带宽方面确实很糟糕-我想是因为我发送的数据包非常小。 所以现在我正在尝试切换到 LV 协议,一次发送几条消息,仅按它们各自的长度分隔(我现在使用协议缓冲区来序列化我的数据)。

我现在有两个问题:

  • 在python中我通过做发送

    sock.send(struct.pack("<H", len(gtMessage.SerializeToString()))) sock.send(gtMessage.SerializeToString())

如果我现在将它放入一个循环并发送其中几条消息,据我所知,我最终会遇到我的老问题。我可以以某种方式将要一起发送的字符串串起来吗?

  • 在 C++ 中,我首先接收消息的长度,然后读取长度字段指示的字节数。

首先从 TCP 读取所有内容然后解析它在性能方面更好,还是我可以读取一条消息,然后解析它,然后才从线路中读取下一位?

编辑:所以在做了更多研究之后,我将第一个问题改写为:

    sock.send("somestring")
    sock.send("somestring")

sock.send("somestring"+"somestring")

?

【问题讨论】:

    标签: c++ python tcp protocol-buffers


    【解决方案1】:

    连续两次发送可能会导致两个实际的数据包出去,这不是很好。要解决此问题,您可以自己连接这两个部分,或者在第一次发送时使用writev(又名“收集写入”)或TCP_CORK,以防止它自己变成一个数据包。

    至于接收端,你应该接收一个大块(尽可能多到一些合理的限制,比如几兆字节或其他东西),然后解析它。不要尝试只接收一个或两个字节的大小,然后再进行另一个接收 - 这是低效的,如果发送的消息是碎片化的,您可能仍会以“短读取”结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-26
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多