我的问题对于网络编程来说更笼统,但是因为我正在尝试编写一个 Modbus TCP 服务器(从站),所以我将用它来说明我的问题。
在 Modbus TCP 帧中,帧的第 5 和第 6 字节给出帧的大小:
字节 1 和 2:事务 ID
字节 3 和 4:协议 ID
字节 5 和 6:帧中剩余的字节数
字节 7 - n:帧的其余部分。
使用NetworkStream.Read()
/BeginRead()
时,如何分隔接收到的帧?
我见过一些开源实现,它们只读取前 6 个字节,解析字节 5 和 6 以获取帧其余部分的大小,然后读取帧的其余部分。但是如果你的框架中没有开始和结束分隔符,你怎么知道框架的开始和结束位置?
例如,也许客户端发送了一些垃圾字符,然后发送了一个好帧。在这种情况下,如果我只读取前 6 个字节,我会错过好帧,并且可能会错过未来的帧,因为我与客户端的节奏不同步。
这个问题并不是真正针对 Modbus,而是针对任何使用“大小”字段来指定帧大小的协议。你如何划分框架?
我觉得我错过了网络编程的一些基础知识,但也许协议设计得不好。