【问题标题】:Changing this protocol to work with TCP streaming更改此协议以使用 TCP 流
【发布时间】:2012-05-25 06:55:49
【问题描述】:

我为我的游戏制定了一个简单的协议:

b = bool
i = int
sINT: = string whose length is INT followed by a : then the string
m = int message id.

例子:

m133s11:Hello Worldi-57989b0b1b0

这将是:

Message ID 133
String 'Hello World' length 11
int -57989
bool false
bool true
bool false

但是我不知道 TCP 可能只发送消息的一部分。我不确定如何修改它以便我可以执行以下操作:

on receive data from client:
use client's chunk parser
process data
if has partial message then try to find matching END
if no partial messages then try to read a whole message

for each complete message in queue, dispatch it

我可以通过在消息的开头添加 B 并在末尾添加 E 来做到这一点,然后解析第一个字符为 B,最后一个字符为 E。

唯一的问题是如果 我在中间收到了一些不符合协议的愚蠢的东西。或者,如果我应该只收到不是消息而只是字符串的东西怎么办。因此,如果我打算以某种方式接收字符串 HelloB,那么我会将其解析为 hello 和消息的开头,但我永远不会收到该消息,因为它不是消息。

如何修改协议以解决这些潜在问题?尽管我预计只会收到格式正确的消息,但如果一个消息编码不良并且一切都乱七八糟,那将是一场噩梦。

谢谢

我决定在开头添加长度并跟踪我是否正在处理消息: 所以:

p32m133s11:Hello Worldi-57989b0b1b0

然后我有 3 种状态,读取以查找 'p',读取以查找 'p' 之后的长度或读取字节直到读取长度字节。

你怎么看?

看起来效果不错。

【问题讨论】:

  • 使用协议缓冲区。或者,在开始时对整个数据包的长度和可能的校验和进行编码。但实际上,使用 PB 或其他已建立的交换格式,没有必要重新发明轮子。
  • 我更喜欢使用我在这里制作的东西。
  • 如果您真的不想使用预定义的协议,请考虑使用 STX/ETX en.wikipedia.org/wiki/C0_and_C1_control_codes 包装整个数据包

标签: c++ tcp


【解决方案1】:

你正在做的是相当老派的磁带东西。不错。

您可能遇到的问题是,如果收到部分消息,则无法判断您是否正在通过令牌。

例如如果您收到:

m12

这是消息 12,还是消息 122 的第一部分?

如果您收到:

i-12

这是一个整数 -12 还是整数 -124354 的第一部分?

所以我认为你需要改变它,使消息编号是固定宽度(例如四位),字符串长度是固定的(例如 6 位),整数宽度是固定在 10 位。

所以你的例子是:

m_133s____11:Hello Worldi____-57989b0b1b0

这样,如果您收到消息的第一部分,您可以将其存储起来,并在处理它之前等待接收其余部分。

您也可以考虑使用控制字符来分隔消息部分。有经常用于此目的的 ascii 控制代码,RS、FS、GS 和 US。所以一条消息可能是

[RS]FieldName[US]FieldValue[RS]fieldName[US]FieldValue[GS].

您知道什么时候有完整的消息,因为 [GS] 标志着结束。然后,您可以使用 [RS] 作为分隔符将其划分为多个字段,并使用 [US] 将每个字段拆分为名称/值。

有关简要信息,请参阅http://en.wikipedia.org/wiki/C0_and_C1_control_codes

【讨论】:

  • 我决定在开头添加长度并跟踪我是否正在处理消息:所以:p32m133s11:Hello Worldi-57989b0b1b0 然后我有 3 个状态,阅读以查找' p',读取'p'之后的长度或读取字节直到读取长度字节。你怎么看?
  • 去吧。如果你得到一个非数字,你已经读完了长度。
猜你喜欢
  • 2018-06-25
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2021-01-06
  • 2013-10-05
  • 1970-01-01
  • 2021-02-08
相关资源
最近更新 更多