2012-10-18 107 views
1

我想获得我的网络接口的名称,速度和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的速度?

回答

1

Win32_NetworkAdapter不支持speed财产XP下,按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

+0

它didint工作仍然得到速度0 – user1406855

+0

那么你可能如果您想要支持Windows的旧版本,请通过WMI执行操作。 – PhonicUK

+1

然后可能sugesten如何做到这一点没有wmi – user1406855

0
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 
} 
1

可以使用在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();     
} 

有了这一空白您更新平:

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"; 

}