2012-04-03 8 views
0

...基本的にはタイトルが言うとおりです。 NetworkStream.Lengthは実装されていません。代替手段は何ですか?.NET NetworkStream.Lengthの回避策のサポートがありません

私はNetworkStream.BeginRead(...)の呼び出しを囲む非同期コールバックの再帰的なシリーズを作ろうとしています。いつ私のベースケースに当たって、すべてのバイトを受け取ったのかを知るためには、ストリーム内のバイトの長さを知る必要があります。このための回避策はありますか?

コード(このコードへのエントリポイントは、タイトルが言う基本的にはまさに... TcpListern.BeginAcceptTcpClientコール:

private void StartRead(IAsyncResult ar) 
{ 
    try 
    { 
     //Do an initial read: 
     AsyncClient client = (AsyncClient)ar.AsyncState; 
     int amountRead = 0; 
     try 
     { 
     amountRead = client.ClientStream.EndRead(ar); 
     } 
     catch (IOException io) 
     { 
     ProcessDebugLog("Async read complete", io); 
     client.ClientStream.Close(); 
     return; 
     } 
     string text = Encoding.UTF8.GetString(client.Bytes, 0, amountRead); 

     //If TCP segmentation has occurred, more blocks will have 
     // to get read in: 
     if (client.ClientStream.Position < client.ClientStream.Length /*EXCEPTION HERE*/) 
     { 
     try 
     { 
      client.ClientStream.BeginRead(client.Bytes, 0, client.Bytes.Length, StartRead, client); 
     } 
     catch (IOException io) 
     { 
      ProcessDebugLog("Async read complete", io); 
      client.ClientStream.Close(); 
     } 
     } 
     else 
     { 
     client.ClientStream.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     ProcessDebugLog("ERROR - StartRead", ex); 
    } 
} 
+1

接続の両側を制御しますか? –

+2

一部のストリームは実際にストリームです。水がなくなるまで、あなたはその川にどれくらいの水があるのか​​分かりません。 –

+0

@Booはい私は両側を制御します。 – kmarks2

答えて

3

後の書き込みである。NetworkStream.Lengthが実装されていない。何が代替です?。あなたは、ストリームの最後まで読み続け

ありはこれに何の代替ではありません - ストリームが閉じられたまでは、いつもより多くのデータが存在することができ

01。

プロトコルを制御する場合、ストリームに複数の「メッセージ」を含めることができる場合は、各メッセージに長さ接頭辞を付ける必要があります。 (あなたは、代替として区切り文字を使用することができますが、それは乱雑です。)

注意をあなたがないあなたはすべてのデータを持ってまで、テキストへバイナリのデコード、またはあなたがあるDecoderを使用する必要がありますする必要があること「完成していない」文字の状態を維持することができます。読み込みが文字の途中で終わる場合があります。

+0

ありがとうございます。メッセージは長さが大きく変わる可能性があるため、デリミタのルートに行きます。私は混乱を緩和できるように私はすべてのクライアントを制御します。私はすぐに私には長さが問題ですが、それはすぐに発生しなかったので、FileStreamの例を取り組んでいたが、あなたは完全に正しいです。アップアップ/解消。 – kmarks2

+2

@ kmarks2:長さが大きく変化するのはなぜデリミタを使うのがよいのでしょうか?送信コードがそのメッセージの送信を開始する前に長さを知っている場合、長さプレフィックスを使用すると、* much * cleanerになります。 –

+0

デプロイされたクライアントが壊れます。また、それらはすべて同じように終了します。これは私が無視したものです。私がクライアントを更新しなければならない場合、私はいくつか欠場する可能性があります。 – kmarks2

関連する問題