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