TCP/IPだけでなく、UDPたが、パケットはそのサイズにいくつかの参照を含めます。 IP headerには、IPヘッダーの長さを指定する16ビットのフィールドとバイトが含まれています。 TCP headerには、32ビットワードのTCPヘッダーのサイズを指定する4ビットのフィールドが含まれています。 UDP headerには、UDPヘッダーの長さを指定する16ビットのフィールドとバイトが含まれます。
ここが問題です。
C#でSystem.Net.Sockets名前空間を使用している場合でも、Win32でネイティブWinsockを使用している場合でも、Windowsの標準的な常用ソケットを使用すると、IP/TCP/UDPヘッダーが表示されません。これらのヘッダーは取り除かれ、ソケットを読み取ったときに得られるものは実際のペイロード、つまり送信されたデータです。
私が今までに見たことがありソケットを使って行ったすべての典型的なパターンは、送信するデータに先行するアプリケーションレベルのヘッダーを定義することです。少なくともこのヘッダーには、データのサイズを含める必要があります。これにより、それぞれの "メッセージ"をそのサイズについて推測することなく、全体として読むことができます。同期パターン、CRC、バージョン、メッセージの種類など、あなたが望むように思い通りになることができますが、「メッセージ」のサイズはすべてです。が必要です。
そして、それは価値があるので、パケットの終わりの区切り記号の代わりにヘッダーを使用することをお勧めします。 EOPデリミタには大きな欠点があるのかどうかはわかりませんが、ヘッダーは私が見たほとんどのIPプロトコルで使用されているアプローチです。また、私のメッセージが完全であることを示すためにストリームにいくつかのパターンが現れるのを待つのではなく、最初からメッセージを処理する方が直感的です。
編集:私はちょうどGoogleプロトコルバッファープロジェクトを認識しています。私が知ることから、それはWCFのためのバイナリのシリアライズ/デシリアライゼーションスキームです(私はそれが大過剰の単純化であると確信しています)。 WCFを使用している場合は、WCF配管が裏でこれを処理するため、送信されるメッセージのサイズについて心配する必要はありません。これはおそらくプロトコルでメッセージの長さに関連するものバッファのドキュメント。しかし、ソケットの場合は、サイズを知ることは、上記のように大いに役立ちます。私の推測では、プロトコルバッファーを使用してデータをシリアル化し、それを送信する前に思い付くアプリケーションヘッダーをタックします。受信側では、ヘッダーを取り除き、残りのメッセージを逆シリアル化します。
protobuf-netを意味するなら、それはWCFだけではありません。プロジェクトにソケットの例があります。 –