首页 文章

如何告诉TCP服务器特定消息已经结束?

提问于
浏览
1

TCP客户端逐字节发送数据 . 那么,如何告诉服务器此消息已结束且新消息现在开始?

一种方法是修复一个特殊字符,它将作为书签发送,但该字符也可能是导致混淆的消息的一部分 .

还有其他最佳出路吗?

4 回答

  • 1

    如果消息是二进制,则无法使用特殊字符进行分隔编码 . 标签长度值(TLV)编码最适合此 .

    例如

    +--------+----------+----------------+    
     |  Tag   | Length   |  Content       |    
     | 0x0001 |  0x000C  | "HELLO, WORLD" |    
     +--------+----------+----------------+
    

    除此之外,您还可以拥有多种消息类型

  • 1

    一种可能的方法是,在发送实际消息之前,您可以发送特定消息中的字节数 . 当接收方已经接收到该字节数时,它可以开始接收下一条消息

  • 1

    如果您希望将字符用作消息标记的结尾或作为消息的一部分,则需要使用转义序列 .

    例如:使用字符'$'结束消息,使用'%'来转义

    %$ -> $
    %% -> %
    

    然后使用'$'结束消息

    所有这些都可以选择在消息开始时发送要接收的字节数(如果您不知道此时完整消息的长度,则发送消息块) .

  • 1

    检查networkComms.net(开源通信框架)中使用的实现 . 特别是第892行here上的IncomingPacketHandleHandOff() .

    它保证接收的第一个字节指定包头的大小(小于255个字节) . 一旦接收到足够的字节以重建报头,就可以检查报头以确定要接收的剩余大小(数据部分) . 如果传入的字节数多于预期的 Headers 和数据部分,则查看第一个字节并重新开始 .

    使用带有书签的字符是在网络堆栈的基础级别使用的,但必须小心实施,以避免进一步的复杂化 .

相关问题