【问题标题】:Messaging Protocol消息协议
【发布时间】:2009-08-26 08:12:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ message protocols


    【解决方案1】:

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

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

    【讨论】:

    • 怎么样?请举个例子,因为没有例子我无法轻易理解:)
    • 看起来像是帮我输入问题
    • - 不要忘记用于超过 255 的消息的方案,即使您现在(或永远)不需要它,至少不要设计会使以后添加它变得困难的消息。 - 也不要忘记防止说谎的信息。例如,我发送了一条长度为 10 的消息,但只发送了 5 个。你锁定(坏)了吗?你能检测到这个吗?断开连接?尝试恢复? - 注意你的缓冲区!不要超越他们! (经典的安全漏洞)
    【解决方案2】:

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

    【讨论】:

    • 怎么样?你能举个例子吗?
    • 发送方将消息负载中的字节数写入线路,然后是消息负载。接收端读取字节数,然后知道payload的长度,读取payload。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 如何给消息加上长度前缀?如果第一次没有发送完整的长度怎么办?
      • 始终继续阅读,直到阅读完整的消息。所以首先,继续阅读,直到你有 x 个字节(长度),然后继续阅读,直到收到根据长度的所有字节。
      • 协议是指发送者和接收者都知道的一组规则。您从一个至少具有 x 字节长度字段的标头开始。接收者必须知道使用的标头。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2011-04-05
        • 1970-01-01
        相关资源
        最近更新 更多