私の質問はネットワークプログラミングに一般的ですが、Modbus TCPサーバー(スレーブ)を作成しようとしているので、それを使用して質問を説明します。
Modbus TCPフレームでは、フレームの5番目と6番目のバイトがフレームのサイズを示します。
バイト1と2:トランザクションID
バイト3と4:プロトコルID
バイト5と6:フレームに残っている
バイト数バイト7- n:フレームの残りの部分。
NetworkStream.Read()
/を使用する場合BeginRead()
、受信したフレームを区切るにはどうすればよいですか?
最初の6バイトを読み取り、バイト5と6を解析して残りのフレームのサイズを取得し、次に残りのフレームを読み取るオープンソースの実装を見てきました。ただし、フレームに開始区切り文字と終了区切り文字がない場合、フレームの開始位置と終了位置をどのようにして知ることができますか?
たとえば、クライアントがいくつかのガベージ文字を送信してから、適切なフレームを送信した可能性があります。この場合、最初の6バイトを読み取っただけでは、クライアントのリズムと同期していないため、適切なフレームが失われ、将来のフレームが失われる可能性があります。
この質問は実際にはModbusに固有のものではなく、「サイズ」フィールドを使用してフレームのサイズを指定するプロトコルに固有のものです。フレームをどのように区切りますか?
ネットワークプログラミングの基本的なものが欠けているように感じますが、プロトコルが適切に設計されていない可能性があります。