Netstat关注于(查找端口)

3

我最近试图执行以下代码:

string strCmdText;
strCmdText = "netstat -np TCP | find " + quote + number + quote + "";
System.Diagnostics.Process.Start("netstat.exe", strCmdText);

Logs.Write("LISTEN_TO(" + Registry_val1.Text + ")", strCmdText);

现在,基本上需要找到所有TCP端口中包含“80”的端口,并在我的自定义日志系统中显示它们,该系统将在我的文件夹中制作一个名为“LISTEN_TO(80)-{date_time} .txt”的日志册。

在这个.txt文件中,它应该包含所发出命令的文本,然而我得到的只是时间。

我已经调试了上述命令,不幸的是,我只知道CMDtext被正确设置,并且我的日志记录系统工作正常,让我别无选择,只能认为NETSTAT可能在查询启动后立即关闭了吗?

希望我提供了足够的信息,因为这是我的第一篇帖子。

问候,

Co

由于描述模糊,这里是另一种尝试做相同代码的方法,但仍然只能得到时间。

const string quote = "\"";
Process p = new Process();
p.StartInfo.FileName = "cmd";
p.StartInfo.Arguments = "netstat -np TCP | find " + quote + number + quote + "";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();

String output = p.StandardOutput.ReadToEnd();

Logs.Write("LISTEN_TO(" + Registry_val1.Text + ")", output);

基本上,你可以将其视为:textbox1.text = output; 但现在输出被放入了日志文件中。

我无法理解这个。你甚至没有对netstat做任何事情,只是启动它然后忘记它。 - mclaassen
我正在使用netstat命令启动程序,并将其输出解析为Logs.Write(log_filename,log_text(被解析的内容))。 - Cotemp
我认为Cotemp的意思是他没有得到命令的输出。@Cotem,你能确认一下吗? - codea
没错,我想我必须练习才能学会如何正确地编写代码,但是我已经通过使用下面Rene的代码解决了这个问题,感谢大家的支持。 - Cotemp
2个回答

10

我不明白你为什么首先使用netstat。.Net框架有许多类可以提供各种数据,在这种情况下,IPGlobalProperties拥有你需要的方法。

var ip =  System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties();

foreach(var tcp in ip.GetActiveTcpConnections()) // alternative: ip.GetActiveTcpListeners()
{
        if (tcp.LocalEndPoint.Port == number 
         || tcp.RemoteEndPoint.Port == number)
        {
           Logs.Write(
                String.Format(
                   "{0} : {1}", 
                   tcp.LocalEndPoint.Address, 
                   tcp.RemoteEndPoint.Address));
        }
}

使用内置类的好处在于轻松地塑造和选择所需内容,最重要的是:您可以避免进行进程外调用和解析输出,节省时间并提高用户体验。

2
对于已接受的答案,有一个更正:您应该使用“GetActiveTcpListeners()”查看活动侦听器,而不是查看“GetActiveTcpConnections()”。 - Stritof

1
你可以尝试这个:

strCmdText = "cmd /c \"netstat -np TCP | find " + quote + number + quote + "\"";

如果这不起作用,请先尝试在命令提示符中使用该命令,以确保它返回数据。 cmd /c "netstat -an | find "80"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接