2012-09-26 39 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

,因为我是新开发者,不明白你的意思,我已经更新我的代码并添加了我所有的课程,我希望它能帮助你 –