2

我应该如何设计我的消息协议,以便区分用户数据和消息的终止。

例如,我从用户那里获取输入以通过 TCP/IP 将其发送给客户端,现在客户端需要知道消息的长度,我认为我使用某种终止方式,客户端通过这种方式识别消息结束已经到达?

我如何在 C++ 中做这样的事情。我正在使用 Windows 套接字

4

5 回答 5

3

对于特定于应用程序的协议,一个相当常见的策略是在消息之前对消息长度进行编码,而不是使用终止。所以前几个字节(多少不同)指定消息长度,一些特殊代码(通常所有位打开或所有位关闭)指定需要继续的超长消息。

编辑:已请求示例。假设我们已经设计了我们的协议,使得消息的最大大小为 255 字节,并且我们想要发送字符串“hi”。我们的协议消息将由三个字节组成:2, 104, 105。第一个字节 ,2告诉我们它后面的消息的长度。第二个和第三个字节104和是和105的 ASCII 码。hi

于 2009-08-26T08:19:13.593 回答
1

您可以先传输长度,然后再传输消息。

于 2009-08-26T08:19:42.610 回答
0

您可以分块发送消息,并在每个块前面加上它的长度。该流将由一个长度为零的块终止。(如果事先不知道流长度,这就是 HTTP 的方式。)

于 2009-08-26T08:19:31.580 回答
0

有许多计算机系统使用特殊标记来确定消息的结尾 - c 在字符数组上使用 \0,JPEG 使用 0xFF 作为标记,等等。

所有这些系统都使我们得出这样的结论,即在消息前面加上它们的长度更加直接和健壮。

TCP 本身实际上就是这样做的。如果您将两个字节的用户输入写入套接字,那么另一端将有两个字节可用,系统正在处理的 TCP 数据包知道这一点,因为它们用有效负载长度标记每个数据包。

完成发送输入后,您可以从一侧关闭套接字并通知另一侧(如果他们已启用此类通知)。

于 2009-08-26T08:22:59.013 回答
0

或者,您可以按照 POP 的示例使用“.”。在空行的开头。

于 2009-08-26T08:24:10.230 回答