我在从套接字解析TCP数据包时遇到了一些问题…
在我的协议中,我的消息如下:
‘A’’B’’C’’D’’E’……0x2300
'A''B''C''D''E'>启动消息模式
0x2300-->两字节结束消息
但由于Nagle's algorithm,有时我的消息会被连接起来,比如:
'A''B''C''D''E'…0x2300'A''B''C''D''E'…0x2300'A''B''C''D''E'…0x2300
我已经尝试过了,但问题仍然存在。
我有一个字节的消息。
我如何将消息拆分为单独解析?
PS:现在我可以得到第一条信息,但其他的信息都丢失了……

最佳答案

您必须将其视为解析连续的字节流。您的代码需要标识消息的开始和结束。
由于数据包的发送方式,您可能有一条完整的消息、多条消息、一条部分消息等。您的代码需要标识消息何时开始,并一直读取,直到找到消息的结尾,或者在某些情况下,当您读取的字节数超过最大消息大小,并且你需要重新同步。
我见过一些通信经理放弃并重新建立连接(重新开始),而其他人则丢弃数据,直到他们能够重新同步。然后你就开始享受是否需要有保证的交付和再传输的乐趣。
最好的协议是简单的协议。创建一个消息头,其中包含一个soh字节、一个两字节的消息长度(或任何适当的内容)、一个两字节的消息类型和一字节的消息子类型。您也可以用任意字节数结束消息。看看一个ASCII图表,有许多十六进制字节00-1f,这是自终端时代以来的标准配置。
在这里重新发明轮子毫无意义。这样做更容易,因为您知道该消息应该持续多长时间,而不是在数据中查找模式。

10-05 21:27