2012-09-26 103 views
1

這是我的方法,該方法開始處理:「捕獲」過程輸出

public class Tshark 
{ 
    public int _interfaceNumber; 
    public string _pcapPath; 
    Process _tsharkProcess; 
    public int _packetsCount; 
    public string _packet; 
    public string _tsharkPath = @"C:\Program Files\Wireshark\tshark.exe"; 
    public delegate void dlgPackProgress(int progress); 
    public event dlgPackProgress evePacketProgress; 

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

    public void startTheCapture() 
    { 
     try 
     { 
      _tsharkProcess = new Process(); 
      _tsharkProcess.StartInfo.FileName = @"C:\Program Files\Wireshark\tshark.exe"; 
      _tsharkProcess.StartInfo.Arguments = string.Format("-i " + _interfaceNumber); 
      _tsharkProcess.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
      _tsharkProcess.StartInfo.RedirectStandardOutput = true; 
      _tsharkProcess.StartInfo.UseShellExecute = false; 
      _tsharkProcess.StartInfo.CreateNoWindow = true; 
      _tsharkProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      _tsharkProcess.Start(); 
      StreamReader myStreamReader = _tsharkProcess.StandardOutput; 

      while (!myStreamReader.EndOfStream) 
      { 
       _packet = myStreamReader.ReadLine(); 
       OnPacketProgress(_packetsCount++); 
      } 

      _tsharkProcess.WaitForExit(); 
     } 
     catch (Exception e) 
     { 

     } 
    } 

    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...    
    } 
} 

方法startTheCapture()被從主模中調用:

private void btnStartCapture_Click(object sender, EventArgs e) 
{ 
    BackgroundWorker bgWorker = new BackgroundWorker(); 
    bgWorker.WorkerReportsProgress = true; 
    bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWSniffer_ProgressChanged); 
    bgWorker.DoWork += new DoWorkEventHandler(
     (s3, e3) => 
     { 
      tshark = new Tshark(2, pcapFilePathSniffer); 
      tshark.startTheCapture(); 

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

    bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     (s3, e3) => 
     { 

     }); 

    bgWorker.RunWorkerAsync(); 

} 

現在這也是從主窗體,我寫了ProgressChanged應該更新我的GUI,但我的問題是,這是行不通的,我不明白爲什麼。

private void bgWSniffer_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    tshark = e.UserState as Tshark; 
    listBoxPacketsSnifferTab.Text += tshark._packet; 
    lblPacketsReceived2.Text = tshark._packetsCount.ToString("#,##0"); 
} 
+0

你不應該只是說, 「不工作」。什麼不工作?它在做什麼,它應該做什麼?如果你得到錯誤,他們是什麼(詳細)。讓我們猜測問題是什麼可能是徒勞的。 – Servy

回答

0

在DoWorkEventHandler,你叫tshark.StartTheCapture()你聯播evePacketProgress事件處理程序之前。

startTheCapture方法阻塞,直到wireshark進程退出,因此在運行時捕獲的任何進度事件將在OnPacketProgress中被「忽略」,因爲沒有事件訂閱者(handler == null)。

它改成這樣:

bgWorker.DoWork += new DoWorkEventHandler(
    (s3, e3) => 
    { 
     tshark = new Tshark(2, pcapFilePathSniffer); 

     //hookup event handler before executing method 
     tshark.evePacketProgress += new Tshark.dlgPackProgress(
      (packet) => 
      { 
       bgWorker.ReportProgress(packet, tshark); 
      }); 

     tshark.startTheCapture(); 


    }); 
+0

感謝您的快速回復,我做了這個改變,但我仍然無法「進入」bgWSniffer_ProgressChanged方法,儘管過程開始 –

+0

@DanaYeger,那麼您將不得不提供更多信息。如果你打破「OnPacketProgress」,是否被調用?如果是,處理程序== null?處理程序是否正確調用?如果否,爲什麼不呢? startTheCapture()中有bug嗎? – pdriegen

+0

,因爲我是新開發者,不明白你的意思,我已經更新我的代碼並添加了我所有的課程,我希望它能幫助你 –