.net网络编程(2)网络适配器

.NET 4.0网络开发入门之旅——我在“网” 中央

.NET 4.0网络开发入门之旅——我在“网” 中央(下)

一.NetworkInterface(网络适配器)

即我们平时查看网卡信息

image

图1

image

图2
1.获取本地网络接口信息

NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();

2.显示某个网络接口信息

private static void ShowNetworkInterfaceBasicInfo(NetworkInterface nic)
{
    Console.WriteLine("名字(Name):{0}", nic.Name);
    Console.WriteLine("描述(Description):{0}", nic.Description);
    Console.WriteLine("id:{0}", nic.Id);
    Console.WriteLine("物理地址:{0}", BitConverter.ToString(
            nic.GetPhysicalAddress().GetAddressBytes()));
    Console.WriteLine("是否仅接收数据包(IsReceiveOnly):{0}",
            nic.IsReceiveOnly);
    Console.WriteLine("类型(NetworkInterfaceType):{0}",
            nic.NetworkInterfaceType);
    Console.WriteLine("是否可接收多播数据包:" + nic.SupportsMulticast);
    Console.WriteLine("当前操作状态:" + nic.OperationalStatus);
}

image

3.IPInterfaceProperties

提供有关支持 Internet 协议版本 4 (IPv4) 或 Internet 协议版本 6 (IPv6) 的网络接口的信息

从图2中可以看到,还提供了很多Ipv4信息,可以用过,以下两个方法返回相应的信息

image

或者直接从IPInterfaceProperties中获取一些公共的信息,假设要在.net中自己做一个网络连接详细信息的界面,就可以用到这些信息,以下属性可以与图2中的信息相对应

image

示例:

private static void ShowNetworkInterfaceIPProperties(NetworkInterface adapter)
{
    IPInterfaceProperties adapterProperties = adapter.GetIPProperties();
    // Try to get the IPv4 interface properties.
    IPv4InterfaceProperties p = adapterProperties.GetIPv4Properties();

    
    // Display the IPv4 specific data.
    Console.WriteLine("  Index ............................. : {0}", p.Index);
    Console.WriteLine("  MTU ............................... : {0}", p.Mtu);
    Console.WriteLine("  APIPA active....................... : {0}",
        p.IsAutomaticPrivateAddressingActive);
    Console.WriteLine("  APIPA enabled...................... : {0}",
        p.IsAutomaticPrivateAddressingEnabled);
    Console.WriteLine("  Forwarding enabled................. : {0}",
        p.IsForwardingEnabled);
    Console.WriteLine("  Uses WINS ......................... : {0}",
        p.UsesWins);
}

结果

image

4.判断是否有任何可用的网络连接

如果有任何网络接口标记为“up”而且不是环回或隧道接口,则认为有可用的网络连接。

用NetworkInterface的静态方法GetIsNetworkAvailable.

其内部实现大致如下

internal static bool InternalGetIsNetworkAvailable()
{

    foreach (NetworkInterface interface2 in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (((interface2.OperationalStatus == OperationalStatus.Up) &&
             (interface2.NetworkInterfaceType != NetworkInterfaceType.Tunnel)) &&
            (interface2.NetworkInterfaceType != NetworkInterfaceType.Loopback))
        {
            return true;
        }
    }
    return false;
}

5.监听网际接口

比如网络突然断开,禁用网络,硬件故障时.这时程序就需要额外的处理

使用.net提供的NetworkChange的静态事件NetworkChange,可以非常方面的监听网络接口

来自MSDN的例子

using System;
using System.Net;
using System.Net.NetworkInformation;

namespace Examples.Net.AddressChanges
{
    public class NetworkingExample
    {
        public static void Main()
        {
            NetworkChange.NetworkAddressChanged += new
            NetworkAddressChangedEventHandler(AddressChangedCallback);
            Console.WriteLine("Listening for address changes. Press any key to exit.");
            Console.ReadLine();
        }
        static void AddressChangedCallback(object sender, EventArgs e)
        {
            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface n in adapters)
            {
                Console.WriteLine("   {0} is {1}", n.Name, n.OperationalStatus);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/Clingingboy/p/1955310.html