2012-04-30 5 views
0

私はソケットベースの遠隔測定アプリケーションを作成しています。私は2つのラジオモデムを使ってデータを送受信し、1つのアプリケーションはモデム1でデータを、もう1つのプログラムはモデム2、インターバルは1秒ですが、レシーバーアプリ(サーバー)がCPUとRAMのリソース(99%のCPU使用量)の大部分を使用しているようで、メモリ使用量は着実に増加しています。私のプログラムが送信されたデータのいくつかのコピーを受け取っているように見えるので、私の元のデータパケットは約70バイトですが、いくつかの後に、私のプログラムはほとんど応答を停止し、データはまったく正しくないので、データは解析できません。秒そのサイズの増加、私はここにサーバープログラムの私の受信ハンドラがあり、私の受信バッファがいっぱいになると、データが、私はいくつかの提案を探しています以前のデータと混合されると思う:ソケットサーバーが多すぎるリソースを使用しています

private void DataReceive() 
    { 
     handler.ReceiveBufferSize = 100; 

     try 
     { 
      byte[] bytes = new byte[100]; 
      int byteRec; 
      while (true) 
      { 
       timer1.Enabled = true; 
       while (true) 
       { 
        byteRec = handler.Receive(bytes); 
        if (byteRec > 0) 
        { 
         data = System.Text.Encoding.UTF8.GetString(bytes, 0, byteRec); 
         break; 
        } 
       } 

       if (data.Length >= 30) 
       { 
        if (data.Substring(0, 1) == "#")//pasrse data, correct! 
        { 
         label27.Text = data.Length.ToString(); 
         textBox1.Text = data; 
         string a = data.Substring(1); 

         string[] b = a.Split('-'); 

         SetControlPropertyThreadSafe(lblTotal, "Text", b[0]); 
         SetControlPropertyThreadSafe(lblFlow, "Text", b[1]); 

         float real_analog2 = (1 - (((20 - float.Parse(b[4]))/(20 - 4)))) * Analog2_Max; 
         if (real_analog2 < 0) 
          real_analog2 = 0; 
         SetControlPropertyThreadSafe(lblAnalog, "Text", real_analog2.ToString()); 

         if (b[2] == "1")//off 
          SetControlPropertyThreadSafe(lblMotion, "Text", "off"); 
         else if (b[2] == "0")//on 
          SetControlPropertyThreadSafe(lblMotion, "Text", "on"); 

         if (b[3] == "1")//off 
          SetControlPropertyThreadSafe(lblMotion2, "Text", "off"); 
         else if (b[3] == "0")//on 
          SetControlPropertyThreadSafe(lblMotion2, "Text", "on"); 

         SetControlPropertyThreadSafe(lblV1, "Text", b[5]); 
         SetControlPropertyThreadSafe(lblV2, "Text", b[6]); 
         SetControlPropertyThreadSafe(lblV3, "Text", b[7]); 
         SetControlPropertyThreadSafe(lblI1, "Text", b[8]); 
         SetControlPropertyThreadSafe(lblI2, "Text", b[9]); 
         SetControlPropertyThreadSafe(lblI3, "Text", b[10]); 
         SetControlPropertyThreadSafe(lblLevelPercent, "Text", b[11]); 
         SetControlPropertyThreadSafe(lblLevelValue, "Text", b[12]); 
        } 
       } 
       FillLstMsg(data); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+1

NetworkStreamを(テキストリーダーとしてStreamReaderを使用して)使用しない特別な理由はありますか? – harold

+0

NetworkStreamはどのように使用できますか?私はちょうどラジオモデムを介してデータを読み取るしたい –

+1

かなり単純な、ちょうど引数としてソケットで新しいものを作成します。 – harold

答えて

2

基本的に私はあなたのアプローチが間違っていると思います。

送信されたデータサイズはどのようにすればよいですか? 最初のパケットメッセージはいつ終了し、もう1つは開始しますか? あなたの完全なパケットメッセージはどれくらい大きいのですか?

これらは、相手側からパケットを受信して​​いる間に慎重に検証する必要があるいくつかの問題です。

私のTCP実装で継承した一般的な方法は、まずパケットサイズを送信してから、そのパケットサイズに基づいてメッセージを処理します。これにより、より堅牢なTCP実装を実現する優れた柔軟性が得られます。これを行うと、クラッシュすることなく次々とパケットを送信できます。

また、データコードを受信して​​プレゼンテーションコードを乱したこともわかります。 すべてのTCP通信操作( )を処理し、受信したデータをコンシューマアプリケーションにスローするために、別個のクラスライブラリを作成する必要があります。

Nito非同期ライブラリは、私にとって非常に良い出発点でした。あなたは彼が何をしているかを見ることができますが、あまりにも高度なテクニックとそこに本当の良いコードですが、あなたは基本的なアイデアをキャッチすることができます。

彼のブログでこのきれいな説明から始めて、コードをcodeplexでキャッチしてください。それはあなたに合った場合、私はあなたのコードにすべての彼の努力を得ることができるので、彼はいくつかのものに更新することを今見、あるいは彼:)

http://nitoprograms.blogspot.com/2009/04/tcpip-net-sockets-faq.html

幸せ読書!

+0

ありがとう、私はクライアントからデータパケットを送信しているのでサイズを知っています。サイズは固定されていません。 " - "を使用してデータ番号を区切りますが、時には複数のパケットがあります。データを解析する!私はあなたの新しいアイデアを試して、私はそれが私を助けることを願って –

+1

最初にパケットサイズを送信し、受信したサイズに基づいて次のパケットを解決します。それは一般的なテクニックであり、それを行う正しい方法です。私が知る限り、他のものは失敗します。何かと分かち合わないでください。あなたはそれを正しく修正し、常に機能する主要な機能を得るためのマイナーな時間があります:) –

1

あなたは(しばらく操作を行うとtrue)には、常にThread.Sleep(x)を追加する必要があります。これにより、ループがタイトなループになるのを防ぎ、CPUを消費します。

数ミリ秒間スリープするだけで十分です。

メモリ消費量はどこかでリークがあると思われます。また、CPUが非常にビジー状態のときは、システムに影響を与えない(つまり、CPU使用率が低い)か、システムのメモリが不足するまで、.NETフレームワークによってガベージコレクションが延期されることも考慮してください。

Thread.Sleepを追加すると、ガベージコレクションが行われ、メモリ使用量が安定している可能性があります。

+0

ありがとうございます、数秒後に受信したデータのサイズはどうなりますか?私はいつも同じデータを持ちたいと思っていますが、私の受信は少し後で大きくなっています –

+0

私は睡眠と行動をテストしましたが、まだ運がありません! –

+1

Socket.Receiveは既にブロックされています(入力がない限り、ループが終了します)。これはタイトなループではありません。 – harold

関連する問題