You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中遍历DataTable匹配PID/进程名获取远程IP的实现方法

解决方案:匹配进程信息并提取远程IP

我来帮你搞定这个需求,核心就是在遍历DataTable时同时匹配PID和进程名,再从Foreign Address列中提取出远程IP地址。下面是修改后的完整代码和关键细节说明:

关键修改点

  • 双重匹配校验:同时检查DataTable行中的PID和Process Name是否与你的procPID、procName完全一致,确保匹配准确性
  • 远程IP提取:兼容IPv4(IP:Port)和IPv6([IP]:Port)两种格式,拆分出纯IP地址内容
  • 异常防护:给Process.GetProcessById添加异常捕获,避免目标进程已退出导致的运行报错

修改后的完整代码

public partial class Pageone : Page {
    public Pageone(MainWindow mainWindow) {
        InitializeComponent();
    }
    private string remoteIp;
    private void Window_Loaded(object sender, RoutedEventArgs e) {
        // 从主窗口获取进程信息
        var window = (MainWindow)Application.Current.MainWindow;
        string procName = window.proc1;
        int subprocPid = window.proc2;
        string procPID = subprocPid.ToString();
        
        using (Process ns = new Process()) {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[] {
                new DataColumn("Protocol"),
                new DataColumn("Local Address"),
                new DataColumn("Foreign Address"),
                new DataColumn("State"),
                new DataColumn("PID"),
                new DataColumn("Process Name"),
            });
            
            ProcessStartInfo psi = new ProcessStartInfo("netstat.exe", "-ano");
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            ns.StartInfo = psi;
            
            // 运行netstat并读取输出
            ns.Start();
            using (StreamReader r = ns.StandardOutput) {
                string output = r.ReadToEnd();
                ns.WaitForExit();
                
                // 解析输出到DataTable(优化拆分逻辑)
                string[] lines = output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string line in lines) {
                    string[] elements = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                    // 跳过表头和无效行
                    if (elements.Length < 5 || elements[0] == "Proto") continue;
                    
                    DataRow dr = dt.NewRow();
                    // 填充基础列(UDP无State字段,单独处理)
                    dr["Protocol"] = elements[0];
                    dr["Local Address"] = elements[1];
                    dr["Foreign Address"] = elements[2];
                    if (elements[0] != "UDP") {
                        dr["State"] = elements[3];
                        dr["PID"] = elements[4];
                    } else {
                        dr["PID"] = elements[3];
                    }
                    
                    // 安全获取进程名(捕获PID不存在的异常)
                    try {
                        dr["Process Name"] = Process.GetProcessById(int.Parse(dr["PID"].ToString())).ProcessName;
                    } catch (ArgumentException) {
                        dr["Process Name"] = "Unknown";
                    }
                    
                    dt.Rows.Add(dr);
                }
                
                // 遍历DataTable,匹配目标进程并提取远程IP
                foreach (DataRow dr in dt.Rows) {
                    // 同时匹配PID和进程名
                    if (dr["PID"].ToString() == procPID && dr["Process Name"].ToString() == procName) {
                        string foreignAddress = dr["Foreign Address"].ToString();
                        // 处理不同IP格式
                        if (foreignAddress.StartsWith("[")) {
                            // IPv6格式:提取[]内的IP
                            remoteIp = foreignAddress.Substring(1, foreignAddress.IndexOf("]") - 1);
                        } else {
                            // IPv4格式:拆分出IP部分
                            remoteIp = foreignAddress.Split(':')[0];
                        }
                        // 若只需第一个匹配结果,找到后直接退出循环
                        break;
                    }
                }
            }
        }
        
        MessageBox.Show(remoteIp ?? "未找到匹配的远程IP");
    }
}

额外说明

  1. 若存在多个符合条件的连接,上述代码仅保留第一个匹配的IP;如果需要收集所有匹配结果,可以改用List<string> remoteIps存储。
  2. 优化了netstat输出的解析逻辑,用StringSplitOptions.RemoveEmptyEntries直接过滤空元素,比原循环更简洁高效。
  3. 添加了空值判断,避免未匹配到IP时弹出空内容的提示框。

内容的提问来源于stack exchange,提问作者Bongchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:06:33