C# 获取所有进程输出,即使在进程终止之后

C# 获取所有进程输出,即使在进程终止之后,c#,wireshark,C#,Wireshark,我使用Tshark开始使用命令行进行捕获,通过这个进程的输出,我计算收到的数据包编号:我的StreamReader读取进程的输出,并在这个输出中解析数据包编号,以便在我的表单上显示这个编号。 我的问题是,在我终止进程后,显示的数据包数量与文件(pcap文件)中的实际数据包数量不同,因此我的问题是是否有方法终止进程,但要等到所有进程输出完成 public class Tshark { public int _interfaceNumber; public string _pcapP

我使用Tshark开始使用命令行进行捕获,通过这个进程的输出,我计算收到的数据包编号:我的StreamReader读取进程的输出,并在这个输出中解析数据包编号,以便在我的表单上显示这个编号。 我的问题是,在我终止进程后,显示的数据包数量与文件(pcap文件)中的实际数据包数量不同,因此我的问题是是否有方法终止进程,但要等到所有进程输出完成

public class Tshark
{
    public int _interfaceNumber;
    public string _pcapPath;
    public int _test;
    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.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
        _tsharkProcess1.StartInfo.RedirectStandardOutput = true;
        _tsharkProcess1.StartInfo.UseShellExecute = false;
        _tsharkProcess1.StartInfo.CreateNoWindow = true;
        _tsharkProcess1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        _tsharkProcess1.Start();

        Thread.Sleep(2000);
        DateTime lastUpdate = DateTime.MinValue;
        StreamReader myStreamReader = _tsharkProcess1.StandardOutput;

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

            if (_packet.StartsWith("    Frame Number:"))
            {
                string[] arr = _packet.Split(default(char[]), StringSplitOptions.RemoveEmptyEntries);
                _test = int.Parse(arr[2]);
                _packetsCount++;
            }

            if ((DateTime.Now - lastUpdate).TotalMilliseconds > 1000)
            {
                lastUpdate = DateTime.Now;
                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...            
    }
}

不要终止进程,而是优雅地关闭它。期待你刚杀了的东西继续和你说话有点过分

你必须想出一些方法来优雅地结束这个过程。确切地说,怎样做才是最好的,我不能从这里判断


使用数据包捕获库可能比依赖外部控制台应用程序更合适。例如pcap.net。我肯定还有其他的LIB。

不知道。你控制了茨哈克吗?不知道那是什么。这是一个控制台应用程序。在控制台上,除了CTRL+C之外,您还可以执行其他操作吗?如果没有,则GenerateConsolectLevent将以编程方式执行相同的操作。如果要停止捕获,则需要在调用
GenerateConsolectLevent
时按CTRL+C。但是使用pcap库会更好。我能举个例子说明如何使用它以及在哪里使用它吗?(我是一名新开发人员…)