arp -a和路由打印

我需要编写一个显示这些信息的程序:

  • netstat的
  • TCP / UDP连接
  • 有关IP ipconfig / all的信息
  • ARP-A
  • 路线打印

我已经有了其中的大部分,但是我在route printarp -a遇到了问题。 我不想使用Process.Start()执行这个命令,因为它看起来不太壮观:

 Process p = new Process (); p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.UseShellExecute = false; p.StartInfo.FileName = "route"; p.StartInfo.Arguments = "PRINT"; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true; p.StartInfo.StandardOutputEncoding = Encoding.Default; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.Start(); TextBox1.Text = p.StandardOutput.ReadToEnd(); 

我想使用foreach循环来获取数据到ListView或DataGrid列。 有没有人能够帮助我? 我怎样才能得到这个数据到每个列:目的地,networking掩码,网关,接口,指标和永久路由? 而在ARP的情况下,Internet地址types的物理地址?

Solutions Collecting From Web of "arp -a和路由打印"

我想你可能可能只是解析你检索的文本,以得到你想要的值,并把它们放在ListView等。但是,我认为有更好的方法来检索这个,我想你可以摆脱这个信息使用WMI类Win32_IP4RouteTable 。

如果您之前没有使用过WMI,那么您可以使用WMI Code Creator v1.0来帮助您开始使用(我自己并没有使用它,但是我有时会看到其他人提示)。

WMI .NET概述可能也会有用。

非常感谢。 我已经写了WMI CODER CREATOR谁已经指示和IPv4路由下面的代码:

 private void button1_Click(object sender, EventArgs e) { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_IP4RouteTable"); ListViewItem buf; foreach (ManagementObject queryObj in searcher.Get()) { string destination = queryObj["Destination"].ToString(); string mask = queryObj["Mask"].ToString(); string metric = queryObj["Metric1"].ToString(); string interfaceIndex = queryObj["InterfaceIndex"].ToString(); string nexthop = queryObj["NextHop"].ToString(); string protocol =queryObj["Protocol"].ToString(); string type = queryObj["Type"].ToString(); string status; if (queryObj["Status"]!=null) { status = queryObj["Status"].ToString(); } else { status = string.Empty; } buf = new ListViewItem(new string[] {destination,mask,metric,interfaceIndex,nexthop,protocol,status,typ}); list_route.Items.Add(buf); } } catch (ManagementException ex) { MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); } } 

只是不知道在哪个类我找到有关arp-a在google上找不到的信息。 如果有人知道他在要求答案。 如果有人有其他有用的帮助,如WMI Coder Creator,不胜感激。

我发现了一些信息。 关于GetIpNetTable,但我不能在GUI应用程序中使用此功能,将结果传递给列表视图。 🙁

 using System; using System.Runtime.InteropServices; using System.ComponentModel; using System.Net; namespace GetIpNetTable { class Program { / / The max number of physical addresses. const int MAXLEN_PHYSADDR = 8; / / Define the MIB_IPNETROW structure. [StructLayout (LayoutKind.Sequential)] struct MIB_IPNETROW { [MarshalAs (UnmanagedType.U4)] public int dwIndex; [MarshalAs (UnmanagedType.U4)] public int dwPhysAddrLen; [MarshalAs (UnmanagedType.U1)] public byte mac0; [MarshalAs (UnmanagedType.U1)] public byte mac1; [MarshalAs (UnmanagedType.U1)] public byte mac2; [MarshalAs (UnmanagedType.U1)] public byte mac3; [MarshalAs (UnmanagedType.U1)] public byte mac4; [MarshalAs (UnmanagedType.U1)] public byte mac5; [MarshalAs (UnmanagedType.U1)] public byte mac6; [MarshalAs (UnmanagedType.U1)] public byte mac7; [MarshalAs (UnmanagedType.U4)] public int dwAddr; [MarshalAs (UnmanagedType.U4)] public int dwType; } / / Declare the GetIpNetTable function. [DllImport ("Iphlpapi.dll")] [Return: MarshalAs (UnmanagedType.U4)] static extern int GetIpNetTable ( IntPtr pIpNetTable, [MarshalAs (UnmanagedType.U4)] pdwSize ref int, bool border); / / The Insufficient buffer error. const int ERROR_INSUFFICIENT_BUFFER = 122; static void Main (string [] args) { / / The number of bytes needed. bytesNeeded int = 0; / / The result from the API call. int result = GetIpNetTable (IntPtr.Zero, ref bytesNeeded, false); / / Call the function, expecting an Insufficient buffer. if (result! = ERROR_INSUFFICIENT_BUFFER) { / / Throw an exception. throw new Win32Exception (result); } / / Allocate the memory, do it in a try / finally block, to ensure code / / That it is released. IntPtr buffer = IntPtr.Zero; / / Try / finally. try { / / Allocate the memory. buffer = Marshal.AllocCoTaskMem (bytesNeeded); / / Make the call again. If it did not Succeed, then / / Raise an error. result = GetIpNetTable (buffer, ref bytesNeeded, false); / / If the result is not 0 (no error), then throw an exception. if (result! = 0) { / / Throw an exception. throw new Win32Exception (result); } / / Now we have the buffer, the have to marshal it. We can read / / The first 4 bytes to get the length of the buffer. int entries = Marshal.ReadInt32 (buffer); / / Increment the memory pointer by the size of the int. IntPtr = new IntPtr currentBuffer (buffer.ToInt64 () + Marshal.SizeOf (typeof (int))); / / Allocate an array of entries. MIB_IPNETROW [] table = new MIB_IPNETROW [entries] / / Cycle through the entries. for (int index = 0; index <entries; index + +) { / / Call PtrToStructure, getting the information structure. table [index] = (MIB_IPNETROW) Marshal.PtrToStructure (new IntPtr (currentBuffer.ToInt64 () + (index * Marshal.SizeOf (typeof (MIB_IPNETROW )))), typeof (MIB_IPNETROW)); } for (int index = 0; index <entries; index + +) { IPAddress ip = new IPAddress (table [index]. DwAddr); Console.Write ("IP:" + ip.ToString () + "\ t \ TMAC"); byte b; b = table [index]. mac0; if (b <0x10) { Console.Write ("0"); } else { Console.Write (""); } Console.Write (b.ToString ("X")); b = table [index]. mac1; if (b <0x10) { Console.Write ("-0"); } else { Console.Write ("-"); } Console.Write (b.ToString ("X")); b = table [index]. mac2; if (b <0x10) { Console.Write ("-0"); } else { Console.Write ("-"); } Console.Write (b.ToString ("X")); b = table [index]. mac3; if (b <0x10) { Console.Write ("-0"); } else { Console.Write ("-"); } Console.Write (b.ToString ("X")); b = table [index]. mac4; if (b <0x10) { Console.Write ("-0"); } else { Console.Write ("-"); } Console.Write (b.ToString ("X")); b = table [index]. mac5; if (b <0x10) { Console.Write ("-0"); } else { Console.Write ("-"); } Console.Write (b.ToString ("X")); Console.WriteLine (); } } finally { / / Release the elephant. Marshal.FreeCoTaskMem (buffer); } } } }