c# Network adapters list

2019-02-22 04:50发布

I have code, which is using System.Net and System.Net.NetworkInformation references, it generates a list of my network connection names.

Everything seems fine and working, but when I made a class of this code, and exported values to listbox1 items add, I had only one network connection name, but really I have four.

How can I solve this problem?

private void button1_Click(object sender, EventArgs e)
{
    Adapters obj = new Adapters();
    var value = obj.net_adapters();
    listBox1.Items.Add(value);
}

public class Adapters
{
    public string net_adapters()
    {
        string value = string.Empty;
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            value = nic.Name;
        }
        return value;
    }
}

3条回答
叼着烟拽天下
2楼-- · 2019-02-22 05:34

Copy and Paste of https://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkinterface(v=vs.110).aspx

public static void ShowNetworkInterfaces()
{
IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
Console.WriteLine("Interface information for {0}.{1}     ",
        computerProperties.HostName, computerProperties.DomainName);
if (nics == null || nics.Length < 1)
{
    Console.WriteLine("  No network interfaces found.");
    return;
}

Console.WriteLine("  Number of interfaces .................... : {0}", nics.Length);
foreach (NetworkInterface adapter in nics)
{
    IPInterfaceProperties properties = adapter.GetIPProperties();
    Console.WriteLine();
    Console.WriteLine(adapter.Description);
    Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length,'='));
    Console.WriteLine("  Interface type .......................... : {0}", adapter.NetworkInterfaceType);
    Console.WriteLine("  Physical Address ........................ : {0}", 
               adapter.GetPhysicalAddress().ToString());
    Console.WriteLine("  Operational status ...................... : {0}", 
        adapter.OperationalStatus);
    string versions ="";

    // Create a display string for the supported IP versions. 
    if (adapter.Supports(NetworkInterfaceComponent.IPv4))
    {
         versions = "IPv4";
     }
    if (adapter.Supports(NetworkInterfaceComponent.IPv6))
    {
        if (versions.Length > 0)
        {
            versions += " ";
         }
        versions += "IPv6";
    }
    Console.WriteLine("  IP version .............................. : {0}", versions);
    ShowIPAddresses(properties);

    // The following information is not useful for loopback adapters. 
    if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback)
    {
        continue;
    }
    Console.WriteLine("  DNS suffix .............................. : {0}", 
        properties.DnsSuffix);

    string label;
    if (adapter.Supports(NetworkInterfaceComponent.IPv4))
    {
        IPv4InterfaceProperties ipv4 = properties.GetIPv4Properties();
        Console.WriteLine("  MTU...................................... : {0}", ipv4.Mtu);
        if (ipv4.UsesWins)
        {

            IPAddressCollection winsServers = properties.WinsServersAddresses;
            if (winsServers.Count > 0)
            {
                label = "  WINS Servers ............................ :";
                ShowIPAddresses(label, winsServers);
            }
        }
    }

    Console.WriteLine("  DNS enabled ............................. : {0}", 
        properties.IsDnsEnabled);
    Console.WriteLine("  Dynamically configured DNS .............. : {0}", 
        properties.IsDynamicDnsEnabled);
    Console.WriteLine("  Receive Only ............................ : {0}", 
        adapter.IsReceiveOnly);
    Console.WriteLine("  Multicast ............................... : {0}", 
        adapter.SupportsMulticast);
    ShowInterfaceStatistics(adapter);

    Console.WriteLine();
}
查看更多
叼着烟拽天下
3楼-- · 2019-02-22 05:42

I would modify the code you currently have:

public string net_adapters() 
{ 
    string value = string.Empty; 
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
        // bug in your original code right here is `=`
        // you proably meant to do something like value += ", " + nic.Name
        // which would not work well with listbox Items collection
        value = nic.Name; 
    } 
    return value; 
} 

To be like this:

public System.Collections.Generic.List<String> net_adapters() 
{ 
    List<String> values = new List<String>();
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
        values.Add(nic.Name);
    } 
    return values; 
}

A more fancy way (although it probably doesn't matter because GetAllNetworkIntefaces probably blocks until it has has a full list) would be to use IEnumerable<T> and yield return:

public IEnumerable<String> net_adapters() 
{ 
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
    { 
        yield return nic.Name;
    } 
    yield break;
}

Either way, you would use it like this:

var obj = new Adapters();    
var values = obj.net_adapters();
listBox1.ItemsSource = values;

(On a side note, I would recommend that you use the .NET Framework Naming Guide)

查看更多
走好不送
4楼-- · 2019-02-22 05:43

You only return the last item value = nic.Name; You should use an array or List to return all items

public List<string> net_adapters()
{
     List<string> values = new List<string>();
     foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
     {
         values.Add(nic.Name);
     }
     return values;
}
查看更多
登录 后发表回答