2012-03-09 16 views
2

AndroidデバイスからC#のTCPサーバにセンサデータを送信しています。アンドロイドクライアントは32バイトの固定サイズのチャンクでデータを送信します。TCPサーバが固定サイズのメッセージを正しく読み取っていない

サーバーでは、完全なパックで提供されると予想されるデータを読み込みましたが、TCPはストリームプロトコルなので、サーバーに到着するメッセージの一部が2つに分かれています。 SocketSniffというソフトウェアで見ることができるので、私はそれを知っています。

問題は、サーバー上でどのように処理するのかわかりません。

私が見つけたすべての例は、NetworkStream.Read()を使用しています。このメソッドでは、読み取るデータ、オフセット、読み込むバイト数を格納するためにバイトの配列を渡す必要があります。このバイト配列は、私の場合32の知っているサイズでなければなりません。

私のサーバーに届いたメッセージの実際のサイズはわかりませんが、次のいずれかの状況が考えられます。

  • 受信したデータサイズが32バイトの場合はすべてOKです。

  • 受信したデータサイズが32バイトより大きい場合は、データが失われていると思います。

  • 受信データサイズが32バイト未満の場合、これらのバイトが20バイトとなり、これらのバイトが配列に格納され、配列の最後の12バイトがゼロのまま残ります。私は実際にいくつかのゼロを受け取っているかもしれないので、実際に受け取ったサイズを知る方法がないので、次の読みに来るべき残りのデータとマージすることはできません。

受信を扱う私のコードは以下の通りです:

int buffer = 32; 
    ... 
    private void HandleClientComm(object client) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] message = new byte[buffer]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       bytesRead = clientStream.Read(message, 0, message.Length); 
      } 
      catch 
      { 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       // Connection closed 
       break; 
      } 

      SensorData sensorData = ProcessTcpPacket(message); 
     } 
     tcpClient.Close(); 
    } 

は、私がソケットで受信していたデータのサイズを知る方法はありますか?

+1

がbytesReadあなたが希望のサイズを返しません。あなたがする必要がどのような

は別のwhileループがこれを気に入って追加しているのですか? –

+1

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

私はちょうどこの質問をすることによって非常にばかばかしいと感じました。 BytesReadは読み込んだバイト量を正確に返しましたが、私はそれを見逃す可能性がありませんでした... Thx – RBasniak

答えて

6

さて、はい、bytesRead変数があります。これは、ストリームから読み取られたバイト数を保持しています。多くの場合、message.Lengthバイトを読み込みますが、読み込み回数は少なくて済みます。

使用可能なバイトがさらにある場合は、message.Lengthバイトだけを読み取ってもそれらを失うことはありません。そうではなく、次にストリームから読むときに利用できるようになります。

int messageRead = 0; 

while(messageRead < message.Length) 
{ 
    int bytesRead = clientStream.Read(message, messageRead, message.Length - messageRead); 
    messageRead += bytesRead; 
    if(bytesRead==0) 
     return; // The socket was closed 
} 
// Here you have a full message 
+2

bytesRead変数を分析して私に何が欠けているかを見せてください。サイズ。 – RBasniak

関連する問題