2012-09-28 37 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语句,尽管行以帧号开始: –

相关问题