2011-10-29 81 views
1

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

我现在有两个问题:

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

做两个连续发送可能会导致两个实际的数据包出去,这并不是很好。要解决这个问题,您可以自己连接这两个部分,或在第一次发送时使用writev(又名“收集写入”)或TCP_CORK以防止它自己变成一个数据包。对于接收方来说,你应该得到一个大块(尽可能达到一些合理的限制,比如几兆字节或者某个东西),然后解析它。不要试图只接收一个或两个字节的大小,然后再接收另一个字节 - 这是效率低下的,如果发送的消息被分段,您仍然可能会以“短读”结束。