如何管理转义序列?

时间:2014-06-23 16:17:11

标签: c++ c sockets

我正在尝试编写一个尽可能简单的协议,以使两个进程通过套接字进行通信。我想将控制命令与原始数据分开。我怎么能得到这个?我的意思是,如果套接字仅携带字节流,我的协议如何区分转义序列“ESC STX”和数字序列2734?我搜索了一下,但我认为还不够,因为我还没有找到解决这个问题的方法。

提前致谢。

2 个答案:

答案 0 :(得分:4)

建立消息协议

例如:

+---------+-----------+----------+  
| Command | Payload   | Checksum |  
| 2 bytes | 252 bytes | 2 bytes  |  
+---------+-----------+----------+  

有效负载可以包含任何模式,因为有效负载是固定大小。

对于可变长度消息,应添加消息长度:

+---------+----------------+-----------+----------+  
| Command | Message Length | Payload   | Checksum |  
| 2 bytes |    2 bytes     | ? bytes   | 2 bytes  |  
+---------+----------------+-----------+----------+  

有效负载的长度由“消息长度”字段的大小决定。

答案 1 :(得分:1)

最简单的解决方案可能是打开2个连接。

一个端口/连接用于控制命令(元数据),另一个连接用于数据。

如果无法选择2个连接,您可以将数据拆分为“消息”。

每条消息都包含一个消息头和一个消息体。消息头包含以下字段:

  • 消息 - 正文长度(=标识下一条消息开头所需的正文字节数)
  • 消息类型(区分转义序列,如ESC STX和实际数据)

由于消息头长度已知的原因,接收器始终知道接收的数据类型。 但是,您还应该在标题中添加某种校验和字段。

<强>逃逸

只需将特殊字节(例如0x00)定义为转义字符即可。每次要传输转义序列(ESC STX)时,都要先发送此字节。

但是,如果要发送数据0x00,则必须发送两次。接收器然后必须更换一些:

  • 0x00后跟0x00 - &gt;没有逃脱序列。删除一个字节,一切正常
  • 0x00后跟任何其他字节 - &gt;删除0x00 - 字节。第二个字节是转义序列,具有特殊含义。