1

在我的应用程序中,我打开 Wireshark 进程并开始捕获包,在 UI 中,我有开始捕获的开始按钮和停止捕获的停止按钮,我通过终止我的 wireshark 进程来做到这一点。我的问题是,如果我在捕获过程中关闭了我的应用程序,但也没有使用我的停止按钮,我的 Wireshark 进程继续运行,我该如何处理这种情况并确保如果我的应用程序崩溃或有人关闭它,我的进程将关闭在捕获中

public void startCapturing()
{            
    ThreadStart tStarter = delegate { openAdapterForStatistics(_device); };
    Thread thread = new Thread(tStarter);
    thread.IsBackground = true;
    thread.Start();
    ProcessStartInfo tsharkStartInfo = new ProcessStartInfo();
    tsharkStartInfo.FileName = _tshark; 
    tsharkStartInfo.RedirectStandardOutput = true; 
    tsharkStartInfo.RedirectStandardError = true; 
    tsharkStartInfo.RedirectStandardInput = true; 
    tsharkStartInfo.UseShellExecute = false; 
    tsharkStartInfo.CreateNoWindow = true; 
    tsharkStartInfo.Arguments = string.Format(" -i " + _interfaceNumber + " -s " + _packetLimitSize + " -w " + _pcapPath);
    _tsharkProcess.StartInfo = tsharkStartInfo;
    _tsharkProcess.ErrorDataReceived += _cmdProcess_ErrorDataReceived;
    _tsharkProcess.OutputDataReceived += tshark_OutputDataReceived; 
    _tsharkProcess.EnableRaisingEvents = true; 
    _tsharkProcess.Start();
    _tsharkProcess.BeginOutputReadLine(); 
    _tsharkProcess.BeginErrorReadLine();                  
    FileInfo fileInfo = new FileInfo(_pcapPath);
    string directoryName = fileInfo.DirectoryName;
    DirectoryInfo directoryInfo = new DirectoryInfo(directoryName);
    FileInfo[] dirs = directoryInfo.GetFiles();
    _file = dirs.FirstOrDefault(f => f.Name.Equals(fileInfo.Name));
    _tsharkProcess.WaitForExit(); 
}
4

2 回答 2

2

假设您正在使用 处理异常try-catch,您可以确保 Wireshark 进程在最顶层语句finally末尾的块中关闭。try-catch从 MSDN 文档:

“finally 块对于清理 try 块中分配的任何资源很有用。无论 try 块如何退出,控制总是传递给 finally 块。”

例如:

try
{
    // Your application's code.
}
catch( Exception )
{
    // Handle, log, whatever.
}
finally
{
    // Make sure Wireshark process is killed.
}

finally无论是否有异常,块中的代码都会被执行。

于 2012-10-13T20:52:58.237 回答
1

你不能百分百确定。如果您的应用程序以“文明”方式崩溃,您可以关闭 Wireshark 进程(很像@jebar8 建议的)。不幸的是,您的应用程序可能会以无法运行finally代码的方式崩溃(例如,如果它内存不足或您的主线程超出堆栈空间)。

如果你也想考虑到这一点,你需要第三个过程。编写一个小程序来启动您的应用程序并对其进行监控。如果您的应用程序进程消失,那么您的监控进程可以杀死 Wirehsark(如果它还活着)。由于监控程序是一个简短而简单的程序,它意外崩溃的可能性非常小。

于 2012-10-13T21:51:56.737 回答