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"); } }
额外说明
- 若存在多个符合条件的连接,上述代码仅保留第一个匹配的IP;如果需要收集所有匹配结果,可以改用
List<string> remoteIps存储。 - 优化了
netstat输出的解析逻辑,用StringSplitOptions.RemoveEmptyEntries直接过滤空元素,比原循环更简洁高效。 - 添加了空值判断,避免未匹配到IP时弹出空内容的提示框。
内容的提问来源于stack exchange,提问作者Bongchi
相关产品推荐
相关产品推荐

