jjzjj

c# - arp -a 和路由打印

coder 2024-06-10 原文

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

  • 网络统计
  • 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 列中。有没有人能帮助我?我怎样才能将这些数据放入每一列:目的地、网络掩码、网关、接口(interface)、指标和永久路由?对于 ARP, 物理地址的互联网地址类型?

最佳答案

非常感谢。我已经用 WMI CODER CREATOR 编写了指导和 IPv4routetable 以下代码:

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, type });
            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 应用程序中使用此函数,将结果传递给 ListView 。 :(

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);
            }
        }
    }
}

关于c# - arp -a 和路由打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4946505/

有关c# - arp -a 和路由打印的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  6. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  9. ruby-on-rails - 如何在 Rails 中设置路由的默认格式? - 2

    路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。

  10. ruby - 如何打印 ruby​​ 对象的实例变量 - 2

    classPacketdefinitialize(name,age,number,array)@name=name@age=age@number=number@neighbors=arrayendendp1=Packet.new("n1",5,2,[1,2,3,4])putsp1.name我有上面的代码,但是每当我执行puts语句时,我都会收到nameisnotamethod的错误。我不知道任何其他方式来打印p1的名称。如何打印姓名? 最佳答案 这里的问题是,虽然您拥有实例变量,但您并未使它们可访问。attr_reader:vari

随机推荐