2012-12-20 17 views
7

私はサーバーとクライアントの間の通信方法を設定しています。私は現時点ではそれを働いていますどのように、ストリームの最初のバイトが来ると、私は、要求の長さを決定することができ、その要求のクラスを探しているものの指標が含まれていることである。NetworkStreamバイト配列に区切り文字を配置する方法は?

stream.Read(message, 0, 1) 

if(message == <byte representation of a known class>) 
{ 
    stream.Read(message, 0, Class.RequestSize); 
} 

私は好奇心が強いです既知の要求を読んだ後にデータが壊れている場合、クラスサイズが分からない場合の処理​​方法。

ストリームに何らかの区切り文字を挿入できると思っていますが、バイトは0-255の間しかないので、ユニークな区切り文字を作成する方法についてはわかりません。メッセージの終わりを表すためにストリームにパターンを配置したいですか?このパターンが実際のデータと誤解されないほどユニークであることを確認するにはどうすればよいですか?

+1

ストリームを固定サイズで分割する**チャンク**(たとえば、64Kとします)現在のサイズの各チャンクに2バイトを追加します。この値が0xFFFFではないチャンクを受け取った後、ストリームの最後に達したチャンクを受け取ると、一意のパターンを持つようにはしないでください。入力データをエンコードしない限り(それによって文字が大きくなります)、**破損することがあります。 –

+0

@Adrianoあなたのアプローチで誰かが0xFFFFサイズを時間の終わりまでに送信するのを防ぐ方法はありますか? – afuzzyllama

+0

送信者が悪意のある人でない場合は、(あなたが任意の制限を設定しない限り)できません。しかし、送信するチャンクの数を指定して(最初のチャンクの前に)余分なカウンタを受け取ることができれば(最大サイズも制限されます)。しかし、私はこの種のデータの整合性チェックを追加するかどうかを2回検討します。この種のものはプロトコル**(TCP接続を使用していますか?)によって低レベル**で処理されます。 –

答えて

4

これにはさまざまなアプローチがあります。 1つの選択肢は、クラス名の長さと、パケット全体の可能性(例えば、常に最初のバイト)を送信することである。こうすることで、そのバイトを読み取ってからnバイトを読み取ってクラス名を取得することができます。

lotの記事を悪意のあるクライアントがあなたのアプリケーションに送信することはありません。あなたはDoSをアプリケーションに送信します。コンプリート。

-1

デリミタとして特に使用されるいくつかの低レベルのバイトがあります。テキストの開始とテキストの終わりにはそれぞれ0x02と0x03の(16進)値があります。また、開始の見出しと送信終了、0x01と0x04があります。これらを使うことができます。

+3

データにこれらの文字が含まれていないことが保証されている場合のみ。彼がバイナリデータを扱っているのであれば、そうではありません。 – ThiefMaster

+0

確かに、彼のデータによりますが、少なくともこれについて言及するのは大丈夫だと思います。 – Davio

関連する問題