使用.net 's NetworkStream.Read/BeginRead定义应用协议帧

本文关键字:BeginRead 定义 应用 协议 Read NetworkStream net 使用 | 更新日期: 2023-09-27 18:08:36

我的问题是更一般的网络编程,但因为我试图写一个Modbus TCP服务器(从),我将用它来说明我的问题。

在Modbus TCP帧中,帧的第5和第6个字节给出了帧的大小:
字节1 &2:事务Id
字节3 &4:协议Id
字节5 &6:帧
还剩下多少字节bytes 7 - n:帧的剩余部分。

当使用NetworkStream.Read()/BeginRead()时,我如何划分接收帧?

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

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

这个问题不是Modbus特有的,而是任何使用"size"字段来指定帧大小的协议。你如何划分框架?

我觉得我错过了一些基本的网络编程,但可能只是协议设计得不好。

使用.net 's NetworkStream.Read/BeginRead定义应用协议帧

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

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