通过TCP实现TLV协议

时间:2011-10-29 17:59:26

标签: c++ python tcp protocol-buffers

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

我现在有两个问题:

  • 在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")

1 个答案:

答案 0 :(得分:1)

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

至于接收方,你应该收到一个大块(尽可能多达一些合理的限制,比如几兆字节或者其他东西),然后解析它。不要尝试只接收一个或两个字节的大小,然后再做另一个接收 - 这是低效的,如果发送的消息是碎片的话,你仍然可能最终得到“短读”。