3

ターンキー ネットワーク通信用の ac# ライブラリを作成しています。データのブロックの終わりを示すためにライブラリで使用できる、あいまいでないバイトを探しています。目標は、形式に関係なく、任意のファイルまたは文字列を送信できるようにすることです。Null文字は、TCP接続を台無しにせず、ファイルや文字列のデータ内にヌル文字が含まれないようにしますか。

前もって感謝します。

編集:ところで、クライアントとサーバーの両方が私のライブラリの一部であるため、他の標準に準拠する必要はありません。

回答後: X バイトの配列を作成し、最後のバイトを使用して、EOF が (X-1) バイトのブロック内のどこにあるかを示します。

4

3 に答える 3

10

あなたは不可能を尋ねます

「任意のファイルまたは文字列」には、任意のバイトシーケンスを含めることができます。

そのため、EOFバイトを見つけることは完全に不可能です。バイトシーケンスでさえ、すべての場合に機能することが保証されているわけではありません。

解決策:ファイルサイズは事前にわかっています

通信ヘッダーの一部として、追跡するデータの長さを送信します。

解決策:ファイルサイズが不明/ストリーミング

ファイルの内容とは別に、さらに多くのデータを追跡するかどうかのマーカーを含むデータ構造を定義します。

于 2012-08-07T04:00:23.313 に答える
4

これは定義上不可能に思えます。常にデータの終わりを知らせる1バイト?ただし、任意のバイトを含めることができるバイナリファイルを含む可能性のある任意のファイルを送信できるようにする必要があります。したがって、EOF用に1バイトを予約できるようにするには、ファイルの内容を制限する必要があることは明らかです。

コメントで言及されているBlorgbeardのように、最初にデータの長さを送信することを検討してください。これは、データのペイロードの長さを示す合意されたバイト数にすることができます。プログラムはこのメタデータを読み取り、パケットが終了する前に読み取ると予想されるバイト数を確認します。

于 2012-08-07T03:59:46.487 に答える
1

もう1つの解決策は、データの本文にある終了文字を「エスケープ」することです。NUL をターミネータとして使用する場合は、NUL を [ESC][SOH] に置き換え、[ESC] を [ESC][ESC] に置き換えます。

これは、任意の長さのストリーミング データに対して機能しますが、両端でデータを反復することを意味します。

于 2012-08-12T23:36:29.540 に答える