【问题标题】:network interface speed网络接口速度
【发布时间】:2012-10-18 14:33:53
【问题描述】:

我想获取我的网络接口的名称、速度和 MAC 地址。

    var searcher = new ManagementObjectSearcher { Scope = GetConnectedScope(target, "cimv2") };

        try
        {
           searcher.Query = new ObjectQuery("SELECT MACAddress, Speed, Name FROM Win32_NetworkAdapter");

            var nicList = new List<NetworkInterfaceModel>();
            foreach (var item in searcher.Get())
            {
                nicList.Add(new NetworkInterfaceModel
                {
                    NetworkInterfaceName = (string)item["Name"],
                    NetworkInterfaceSpeed = (double)(item["Speed"] != null ? (ulong) item["Speed"] : 0)/1000/1000,
                    MacAddress = (string)item["MACAddress"]
                });
            }

对于 Windows 7 和 Vista,它工作得很好,但对于 XP 和 Windows Server 2003,它没有加快速度。如何获得 XP 和 Server 2003 的速度?

【问题讨论】:

    标签: c# windows-xp


    【解决方案1】:

    Win32_NetworkAdapter不支持XP下的speed属性,按照http://msdn.microsoft.com/en-us/library/windows/desktop/aa394216(v=vs.85).aspx

    Windows Server 2003、Windows XP、Windows 2000 和 Windows NT 4.0:此属性尚未实现。它默认返回一个 NULL 值。

    改为使用具有相同属性的CIM_NetworkAdapter 类。

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa387931(v=vs.85).aspx

    【讨论】:

    • 如果你想支持旧版本的 Windows,你可能不走运通过 WMI。
    • 那么可能已经提示如何在没有 wmi 的情况下执行此操作
    【解决方案2】:
    using System.Net;
    foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces()) {
        Debug.WriteLine(netInterface.Name); // Name
        Debug.WriteLine(netInterface.Speed); // Speed
        Debug.WriteLine(netInterface.GetPhysicalAddress().ToString()); // MAC
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用 windows cmd 获取网络名称:

      Process p = new Process();
      p.StartInfo.FileName = "netsh.exe";
      p.StartInfo.Arguments = "wlan show interfaces";
      p.StartInfo.UseShellExecute = false;
      p.StartInfo.RedirectStandardOutput = true;
      p.Start();
      string s = p.StandardOutput.ReadToEnd();
      string s1 = s.Substring(s.IndexOf("SSID"));
      s1 = s1.Substring(s1.IndexOf(":"));
      s1 = s1.Substring(2, s1.IndexOf("\n")).Trim();
      p.WaitForExit();
      
      namelabel.Text = s1;
      

      对于 MAC 地址:

       IPAddress IP = IPAddress.Parse("192.168.1.1");
       byte[] macAddr = new byte[6];
       uint macAddrLen = (uint)macAddr.Length;
       UInt32 nRet = 0;
       uint nAddress = BitConverter.ToUInt32(IP.GetAddressBytes(), 0);
       nRet = SendARP(nAddress, 0, macAddr, ref macAddrLen);
       if (nRet == 0)
       {
           string[] sMacAddress = new string[(int)macAddrLen];
      
           for (int i = 0; i < macAddrLen; i++)
           {
               sMacAddress[i] = macAddr[i].ToString("x2");
               string macAddress += sMacAddress[i] + (i < macAddrLen - 1 ? ":" : "");
      
           }
       }
      

      关于速度,您可以使用以下代码:

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Forms;
      using System.Net.NetworkInformation;
      

      首先添加一个 timerInteval(您希望以多快的速度更改为新值)一个 NetworkInteface 和一个计时器:

      private const double timerUpdate = 1000;
      private NetworkInterface[] nicArr;
      private Timer timer;
      

      然后在启动时继续使用以下组件:

      public Form1()
          {
              InitializeComponent();
              InitializeNetworkInterface();
              InitializeTimer();
          }
      

      组件:

      private void InitializeNetworkInterface()
      {
          // Grab all local interfaces to this computer
          nicArr = NetworkInterface.GetAllNetworkInterfaces();
      
          // Add each interface name to the combo box
          for (int i = 0; i < nicArr.Length; i++)
              comboBox1.Items.Add(nicArr[i].Name); //you add here the interface types in a combobox and select from here WiFi, ethernet etc...
      
          // Change the initial selection to the first interface
          comboBox1.SelectedIndex = 0;
      }
      private void InitializeTimer()
      {
           timer = new Timer();
           timer.Interval = (int)timerUpdate;
           timer.Tick += new EventHandler(timer_Tick);
           timer.Start();
       }
      

      计时器的滴答声

      void timer_Tick(object sender, EventArgs e)
      {
          UpdateNetworkInterface();                
      }
      

      有了这个空白,你可以更新 ping:

      public void UpdatePing()
      {     
          try
          {
              Ping myPing = new Ping();
              PingReply reply = myPing.Send(textBox1.Text, 1000);
              if (reply != null)
              {
                  label17.Text = reply.Status.ToString();
                  label18.Text = reply.RoundtripTime.ToString();                    
              }
          }
          catch
          {
              label17.Text = "ERROR: You have Some TIMEOUT issue";
              label18.Text = "ERROR: You have Some TIMEOUT issue";                
          }
      }
      

      最后用它以网络形式显示速度:

      private void UpdateNetworkInterface()
      {
          // Grab NetworkInterface object that describes the current interface
          NetworkInterface nic = nicArr[comboBox1.SelectedIndex];
      
          // Grab the stats for that interface
          IPv4InterfaceStatistics interfaceStats = nic.GetIPv4Statistics();
      
          // Calculate the speed of bytes going in and out
          // NOTE: we could use something faster and more reliable than Windows Forms Tiemr
          //       such as HighPerformanceTimer http://www.m0interactive.com/archives/2006/12/21/high_resolution_timer_in_net_2_0.html
      
          // Update the labels
          speedlbl.Text = nic.Speed.ToString();
          interfaceTypelbl.Text = nic.NetworkInterfaceType.ToString();            
          bytesReceivedlbl.Text = interfaceStats.BytesReceived.ToString();
          bytesSentlbl.Text = interfaceStats.BytesSent.ToString();
      
          int bytesSentSpeed = (int)(interfaceStats.BytesSent - double.Parse(label10.Text)) / 1024;
          int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived - double.Parse(label11.Text)) / 1024;
      
          bytescomelbl.Text = bytesSentSpeed.ToString() + " KB/s";
          bytessentlbl.Text = bytesReceivedSpeed.ToString() + " KB/s";
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-26
        相关资源
        最近更新 更多