2012-09-28 35 views
0

我有一個應用程序捕獲(使用wireshark)數據包,我希望在我的窗體上顯示接收數據包的數量。由於高速網絡而導致進程輸出時,應用程序停滯

代碼:

public class Tshark 
{ 
    public int _interfaceNumber; 
    public string _pcapPath; 
    public int _packetsCount; 
    public string _packet; 
    public delegate void dlgPackProgress(int progress); 
    public event dlgPackProgress evePacketProgress; 

    public Tshark(int interfaceNumber, string pcapPath) 
    { 
     _interfaceNumber = interfaceNumber; 
     _pcapPath = pcapPath; 
    } 

    public void startTheCapture() 
    { 
     Process _tsharkProcess1 = new Process(); 
     _tsharkProcess1.StartInfo.FileName = @"C:\Program Files\Wireshark\tshark.exe"; 
     _tsharkProcess1.StartInfo.Arguments = string.Format(" -i " + _interfaceNumber + " -V -x -w " + _pcapPath); 
     //_tsharkProcess1.StartInfo.Arguments = string.Format(" -i " + _interfaceNumber + " -c " + int.MaxValue + " -w " + _pcapPath); 
     _tsharkProcess1.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
     _tsharkProcess1.StartInfo.RedirectStandardOutput = true; 
     _tsharkProcess1.StartInfo.UseShellExecute = false; 
     _tsharkProcess1.StartInfo.CreateNoWindow = true; 
     _tsharkProcess1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     _tsharkProcess1.Start(); 

     StreamReader myStreamReader = _tsharkProcess1.StandardOutput; 

     while (!myStreamReader.EndOfStream) 
     { 
      _packet = myStreamReader.ReadLine(); 

      //if (_packet.StartsWith("Frame Number: ")) 
      //{ 
      // string[] arr = _packet.Split(' '); 
      // _test = int.Parse(arr[2]); 
      // _packetsCount++; 
      //} 

      OnPacketProgress(_packetsCount++); 
     } 

     _tsharkProcess1.WaitForExit(); 
    } 

    private void OnPacketProgress(int packet) 
    { 
     var handler = evePacketProgress; 
     if (handler != null) 
     { 
      handler(packet); 
     } 
    } 

    public void killProcess() 
    { 
     foreach (Process prc in System.Diagnostics.Process.GetProcessesByName("tshark")) 
     { 
      prc.Kill(); 
      prc.WaitForExit(); 
     } 
    } 

    private void process_OutputDataReceived(object sender, DataReceivedEventArgs arg) 
    { 
     string srt = arg.Data; //arg.Data contains the output data from the process...    
    } 
} 

該類啓動tshark的,並開始從主要形式捕捉我有這個ProgressChanged該樣本的類屬性,以我的表格上顯示的數據包數量,問題是,如果我例如在我的網絡(BitTorrent下載)上我的表格卡住了很高的速度,也許我可以通過每隔幾秒樣本類屬性來解決這個問題?

private void bgWSniffer_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    tshark = e.UserState as Tshark; 
    lbl.Text = tshark._packetsCount.ToString(); 
    lbl.Text = tshark._packet; 
} 

我知道有問題的線路是OnPacketProgress(_packetsCount ++);

我的啓動按鈕誰開始捕獲:

private void btnStartCapture_Click(object sender, EventArgs e) 
{ 
    lblStatusSnifferTab2.Text = "Listening on ip address " + lblIpAddressSnifferTab2.Text; 
    timerSniffer.Start(); 
    btnStartTabSniffer.Enabled = false; 
    btnStopTabSniffer.Enabled = true; 
    groupBoxSelectTabSniffer.Enabled = false; 
    groupBoxOptionsSnifferTab.Enabled = false; 
    groupBoxCaptureFilesTabSniffer.Enabled = false; 
    groupBoxStopCaptureSnifferTab.Enabled = false; 
    bgWorker = new BackgroundWorker(); 
    bgWorker.WorkerReportsProgress = true; 
    bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWSniffer_ProgressChanged); 
    bgWorker.DoWork += new DoWorkEventHandler(
     (s3, e3) => 
     { 
      tshark = new Tshark(2, pcapFilePathSniffer);      

      tshark.evePacketProgress += new Tshark.dlgPackProgress(
       (packet) => 
       { 
        bgWorker.ReportProgress(packet, tshark); 
       }); 

      tshark.startTheCapture(); 
     }); 

    bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     (s3, e3) => 
     { 
      groupBoxSelectTabSniffer.Enabled = true; 
      groupBoxCaptureFilesTabSniffer.Enabled = true; 
     }); 

    bgWorker.RunWorkerAsync(); 
} 
+0

你的問題沒有道理。請重寫這個問題? – L0j1k

+0

爲什麼沒有意義?我知道表單卡住了,因爲它無法更新得如此之快,我正在尋找解決方案 –

+0

您必須將運行該進程的代碼移動到單獨的線程中。然後當你必須更新表單(請務必進行調用) –

回答

1

一個解決辦法是做(用毫秒,所以你可以有很好的控制,如果你想要的是秒,你可以使用TotalSeconds):

DateTime lastUpdate = DateTime.MinValue; 

    while (!myStreamReader.EndOfStream) 
    { 
     _packet = myStreamReader.ReadLine(); 

     //if (_packet.StartsWith("Frame Number: ")) 
     //{ 
     // string[] arr = _packet.Split(' '); 
     // _test = int.Parse(arr[2]); 
     // _packetsCount++; 
     //} 

     // If more than one second 
     if((DateTime.Now - lastUpdate).TotalMilliseconds > 1000) 
     { 
      lastUpdate = DateTime.Now; 
      OnPacketProgress(_packetsCount++); 
     } 
    } 

此外,我注意到,您調用OnPacketProgress時使用後增量。這將傳遞_packetsCount的當前值,然後在OnPacketProgress返回後將其增加。你應該仔細檢查這是否是你想要的。

+0

我添加了開始按鈕誰開始捕獲 –

+0

在_packet = myStreamReader.ReadLine();我正在尋找幀號:X(包號),當我趕上這一行我想增加數據包計數1,但我沒有成功 –

+0

謝謝,我的過程的輸出是塊的行,一個他們代表數據包編號 - >幀號:X,我想解析這個數字,並將其每隔幾秒鐘移動到我的表單,但我不知道爲什麼我的while循環無法進入if語句,儘管行以幀號開始: –

相關問題