【发布时间】:2018-12-31 00:03:26
【问题描述】:
我想用 C# 运行“cmd”命令来获取我计算机中所有打开的端口。
首先,我不知道为什么IPGlobalProperties 不显示所有打开的端口和套接字,例如udp 端口。
为了获取所有端口和套接字,我在 C# 中使用了 netstat 命令和 ProcessInfo。
由于某些原因,我想多次运行我的应用程序。
当我第一次运行该应用程序时,它运行得很快并且没问题。但多次运行后,它运行缓慢。
例如,当我第五次运行它时,它会在几分钟后处理!
这是我的代码的一部分:
Port = 9999;
ProcessStartInfo ProcessInfo;
Process Process;
List<int> openPorts = new List<int>();
Repeat:
ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + "netstat -an | find " + "\"" + Port + "\"");
ProcessInfo.CreateNoWindow = true;
ProcessInfo.UseShellExecute = false;
ProcessInfo.RedirectStandardOutput = true;
Process = Process.Start(ProcessInfo);
StreamReader reader = Process.StandardOutput;
string result = reader.ReadLine();
Process.Kill();
Process.WaitForExit();
if (result.Contains(networkPort.ToString()))
{
openPorts.Add(networkPort);
Port++;
goto Repeat;
}
dosomething();
有人知道为什么吗?
我只想要我计算机中所有打开的套接字和端口的列表。
不管我是如何得到它的,用 C# 本身或 cmd,我只希望它快。
我该怎么做?
【问题讨论】:
-
您应该避免尝试通过 cmd 从某物获取信息。正如您所经历的那样,它会很慢,您将不得不使用“脏”输出。我建议查看 System.Net.NetworkInformation。里面有很多有用的工具可以帮助你。
-
另外,避免在 C# 中使用
goto,而是使用循环语法之一(do...while、while、for、foreach) -
你的问题,除了没有编程,是你每次运行它时都要壳两个进程。而且只有一个出口。见
cmd /?。CMD完全没有必要。 -
你能解释一下吗? @猫猫
-
每次启动 CMD.exe 并要求它保持运行 (
/k),然后要求 CMD 启动 NetStat。只需启动 NetStat。