首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过TCP实现TLV协议

通过TCP实现TLV协议
EN

Stack Overflow用户
提问于 2011-10-29 17:59:25
回答 1查看 1.8K关注 0票数 1

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

我现在有两个问题:

  • 在python中,我通过做 sock.send(struct.pack("<H", len(gtMessage.SerializeToString()))) sock.send(gtMessage.SerializeToString())

据我所知,如果我现在把它放到一个循环中并发送几条这样的消息,我就会以我以前的问题告终。我能以某种方式把要发送的字符串串起来吗?

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

首先从TCP读取所有内容,然后解析它,或者我可以读取一条消息,然后解析它,然后才从有线读取下一位消息,这样性能会更好吗?

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

代码语言:javascript
复制
    sock.send("somestring")
    sock.send("somestring")

相同于

代码语言:javascript
复制
sock.send("somestring"+"somestring")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-30 13:59:10

在一行中执行两次发送可能会导致两个实际的数据包输出,这不是很好。要解决这个问题,您可以自己将这两块连接起来,或者在第一次发送时使用writev (也就是“收集写”)或软木来防止它本身变成一个包。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7940685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档