2

我的问题对于网络编程来说更笼统,但是因为我正在尝试编写一个 Modbus TCP 服务器(从站),所以我将用它来说明我的问题。

在 Modbus TCP 帧中,帧的第 5 和第 6 字节给出帧的大小:
字节 1 和 2:事务 ID
字节 3 和 4:协议 ID
字节 5 和 6:帧中剩余的字节数
字节 7 - n:帧的其余部分。

使用NetworkStream.Read()/BeginRead()时,如何分隔接收到的帧?

我见过一些开源实现,它们只读取前 6 个字节,解析字节 5 和 6 以获取帧其余部分的大小,然后读取帧的其余部分。但是如果你的框架中没有开始和结束分隔符,你怎么知道框架的开始和结束位置?

例如,也许客户端发送了一些垃圾字符,然后发送了一个好帧。在这种情况下,如果我只读取前 6 个字节,我会错过好帧,并且可能会错过未来的帧,因为我与客户端的节奏不同步。

这个问题并不是真正针对 Modbus,而是针对任何使用“大小”字段来指定帧大小的协议。你如何划分框架?

我觉得我错过了网络编程的一些基础知识,但也许协议设计得不好。

4

1 回答 1

1

在大多数 Internet 协议中,客户端不应该发送垃圾字符:如果客户端发送垃圾,服务器将发送错误并关闭连接。如果客户端想要继续与服务器通信,它需要创建一个新的连接并在这一次正常运行。

有一些协议使用自同步代码。这允许接收者从流中的任何位置找到下一帧的开始。

于 2011-09-15T14:13:42.367 回答