我应该如何设计我的消息协议,以便区分用户数据和消息的终止。
例如,我从用户那里获取输入以通过 TCP/IP 将其发送给客户端,现在客户端需要知道消息的长度,我认为我使用某种终止方式,客户端通过这种方式识别消息结束已经到达?
我如何在 C++ 中做这样的事情。我正在使用 Windows 套接字
对于特定于应用程序的协议,一个相当常见的策略是在消息之前对消息长度进行编码,而不是使用终止。所以前几个字节(多少不同)指定消息长度,一些特殊代码(通常所有位打开或所有位关闭)指定需要继续的超长消息。
编辑:已请求示例。假设我们已经设计了我们的协议,使得消息的最大大小为 255 字节,并且我们想要发送字符串“hi”。我们的协议消息将由三个字节组成:2
, 104
, 105
。第一个字节 ,2
告诉我们它后面的消息的长度。第二个和第三个字节104
和是和105
的 ASCII 码。h
i
您可以先传输长度,然后再传输消息。
您可以分块发送消息,并在每个块前面加上它的长度。该流将由一个长度为零的块终止。(如果事先不知道流长度,这就是 HTTP 的方式。)
有许多计算机系统使用特殊标记来确定消息的结尾 - c 在字符数组上使用 \0,JPEG 使用 0xFF 作为标记,等等。
所有这些系统都使我们得出这样的结论,即在消息前面加上它们的长度更加直接和健壮。
TCP 本身实际上就是这样做的。如果您将两个字节的用户输入写入套接字,那么另一端将有两个字节可用,系统正在处理的 TCP 数据包知道这一点,因为它们用有效负载长度标记每个数据包。
完成发送输入后,您可以从一侧关闭套接字并通知另一侧(如果他们已启用此类通知)。
或者,您可以按照 POP 的示例使用“.”。在空行的开头。