2016-10-11 10 views
0

私は未知のメッセージサイズが入っているところでtcpリスナーをセットアップしました。未知のメッセージサイズを扱う際のベストプラクティスは何か分かりません。ここでは、コードは次のようになります。未知のメッセージサイズでのtcp要求を受信

TcpListener _server = new TcpListener(_localAddr, _port); 
_server.Start(); 
while (true) 
{ 
    if (_server.Pending()) 
    { 
     Byte[] bytes = new Byte[256];//Works fine if message under this size 
     string data = string.Empty; 
     _client = _server.AcceptTcpClient(); 
     NetworkStream stream = _client.GetStream(); 
     int i; 
     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
     { 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
      data = data.ToUpper(); 
      //Do stuff with data 
     } 
} 

ですから、私は256から何か大きなものに配列バイトのサイズを変更することができ気づくでしょうが、ちょうど何か私にサイズを設定するより良い方法があるかどうか私は知りません知っているのは十分です。メッセージが256より小さい場合、正常に動作します。事前

答えて

1

で任意の助け

感謝のメッセージの長さは永久的ではない場合のInt32である32ビットであるので、あなたにメッセージを送信するサービスは、すべてのメッセージの先頭に数バイト(通常は4あなたを送信する必要があります4バイト)で、メッセージの長さを示します。

メッセージを受け取ったら、まずこの4バイトを読み取ってから解析した後、メッセージの長さを知り、適切なサイズのバイト配列を作成できます。

この配列にメッセージ自体を読み込むことができます。

+0

クライアントからは、次のように伝えました。MatrixがInterface Serverに送信するすべてのXMLメッセージは、EOT(0x04)バイトで終了します。これは始まりではなくメッセージの終わりです。終わりにどのようになっているのか分かりません。 – Maxqueue

+0

上記以外の別のアプローチがあります。このapprochでは、これがメッセージの最後であることを示すデリミタが得られます。この場合、デリミタに達するまで、メッセージのバイト後にバイトを繰り返す必要があります。あなたがそれに到達する前にメッセージの終わりを知ることはできません。だから、メッセージを保持するためにいくつかのメモリを割り当てるべきですが、メッセージが割り当てられたメモリよりも大きいバイトを反復処理しているのに気がついたら、それを増やすべきです。 – YuvShap

+0

はい、これは現在私が感謝するつもりです。ちょうど簡単な方法がないことを確認したかっただけです。 – Maxqueue

関連する問題