【问题标题】:C# excuting cmd commands is very slowC#执行cmd命令很慢
【发布时间】: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...whilewhileforforeach
  • 你的问题,除了没有编程,是你每次运行它时都要壳两个进程。而且只有一个出口。见cmd /?CMD 完全没有必要。
  • 你能解释一下吗? @猫猫
  • 每次启动 CMD.exe 并要求它保持运行 (/k),然后要求 CMD 启动 NetStat。只需启动 NetStat。

标签: c# cmd scripting udp port


【解决方案1】:

因此,这不会回答您的问题,但它可能会引导您朝着正确的方向前进。此代码将为您提供所有使用的端口:

static void Main(string[] args)
{
    var props = IPGlobalProperties.GetIPGlobalProperties();
    var conns = props.GetActiveTcpConnections();

    foreach (var conn in conns)
    {
        Console.WriteLine((conn.LocalEndPoint.Port));
    }

    Console.ReadKey();
}

【讨论】:

  • 坦克但这不是我的答案。我以前用过这种方法!它只显示TCP 端口。但它并没有显示所有开放的端口,如UDP。当您输入netstat 命令时,它会显示更多信息。
  • 公平地说,“var conns = props.GetActiveUdpListeners();”怎么样?
  • 再一次,并不是所有的开放端口,但我相信你可以从那里开始。应该有办法得到所有用过的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多