2012-05-08 12 views
0

TCPクライアントに何らかの問題が発生しました。このサービスはサーバーに接続し、受信して90%処理されたメッセージを受信します。ちょっとしたデバッグの後、私は「データのパケット全体を読み取ることができません!」というメッセージが表示されることがありました。エラー(コード内)C#TCPクライアントで非同期処理エラーが発生しました

サーバーの送信内容を制御できません。 私は、完全なメッセージを受け取っていないと考えています(長いメッセージでは失敗しますが、ボリュームでは不安です)。

私がこれを説明できる最良の方法は何ですか、またはその他のヒントです。私はすべての行動と問題がどこにあるのか私の受信方法を持っています。

私は、これはTCPと私の最初の試みであるので、あなたはTCPサーバから1回の読み取りに全体「メッセージ」を取得することを前提とすることはできません

public void Receive(IAsyncResult ar) 
     { 
      if (ar != null) 
      { 
       try 
       { 

        byte[] mLenBytes = (byte[])ar.AsyncState; 
        byte[] mDataBytes = null; 
        int bytes_read = mTcpClient.Client.EndReceive(ar); 
        if (bytes_read != 4) 
         throw new Exception("Unable to read whole header!"); 
        int len = mLenBytes[3] + ((mLenBytes[2] + (mLenBytes[1] + (mLenBytes[0] << 8)) << 8) << 8); 
        mDataBytes = new byte[len]; 
        bytes_read = mTcpClient.Client.Receive(mDataBytes, len, SocketFlags.None); 
        if (bytes_read != len) 
         throw new Exception("Unable to read whole packet of data!" + "Expected " + len + " Got " + Convert.ToString(bytes_read) + "\r\n" + (System.Text.Encoding.ASCII.GetString(mDataBytes))); 
         //This is the error that is raised!. 

        // raise an event 
        PhoneBoxEventArgs e1 = new PhoneBoxEventArgs(System.Text.Encoding.UTF8.GetString(mDataBytes)); 
        Console.WriteLine("Data received is = " + e1.Data); 
        OnPassEvent(e1); 

       } 
       catch (Exception ex) 
       { 

       } 

      } 
      byte[] mLenBytes_new = new byte[4]; 
      mTcpClient.Client.BeginReceive(mLenBytes_new, 0, 4, SocketFlags.None, new AsyncCallback(Receive), mLenBytes_new); 
     } 

答えて

3

恐れることはありません申し訳ありません。そういうわけで、あなたはヘッダーの全部をやります。

ヘッダーは、4バイトの長さで、何バイト続くべきかを示します。だから、何をする必要がある:あなたがヘッダーに

を受けるように言われてきたように、あなたができるだけ多くのバイトを持つまで

  1. 読むには非同期にあなたが4バイト
  2. を持ってまで、非同期に読んでくださいあなたがやっていることです:
    1. は、あなたが一度に4つのバイトを取得し、あなたは(あなたが1つを受信中に4つのバイトを取得することを想定することができないという問題が)ない場合に失敗したと
    2. として多くのバイトをすることができますように受信、あなたは(再び問題:あなたは、一度にすべてのバイトを受け取ることを確認することはできません)十分なバイトを取得していない場合には失敗も私はあなたのコードから伝えることができます

    非同期で受信を開始しました。ヘッダを取得した後、なぜ同期受信に切り替えるのですか?

+0

はい私はヘッダーを取得するように変更しましたが、私は合計を受け取っていないうちに私は試し続けます!ヒントをありがとう。 – user685590

関連する問題