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

Clients are not supposed to send garbage characters in most Internet protocols: If a client sends garbage, the server will send an error and close the connection. If the client wants to continue communicating with the server, it needs to create a new connection and behave properly this time.

There a some protocols that use a Self-synchronizing code. This allows a recipient to find the start of the next frame from any position within the stream.

于 2011-09-15T14:13:42.367 に答える