ZetCode

C# NetworkInterface

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何在 C# 中处理网络接口。

System.Net 命名空间为当今网络上使用的许多协议提供了简单的编程接口。

网络接口是计算机与专用或公共网络之间的互连点。 它可以是物理网络接口卡 (NIC),也可以实现为虚拟软件接口。

NetworkInterface 提供网络接口的配置和统计信息。 它位于 System.Net.NetworkInformation 命名空间中。

$ ls /sys/class/net/
lo  wlp0s20f3

在基于 Debian 的 Linux 系统上,我们可以在 /sys/class/net 中找到可用的接口。

C# GetIsNetworkAvailable

GetIsNetworkAvailable 方法指示是否任何网络连接可用。

Program.cs
using System.Net.NetworkInformation;

if (NetworkInterface.GetIsNetworkAvailable())
{
    Console.WriteLine("Network available");
} else 
{
    Console.WriteLine("Network not available");
}

该程序打印网络是否可用。

C# 列出网络接口

在第一个示例中,我们列出所有网络接口。

Program.cs
using System.Net.NetworkInformation;

var nics = from nic in NetworkInterface.GetAllNetworkInterfaces()
           where nic.OperationalStatus == OperationalStatus.Up
           select nic;

foreach (var nic in nics)
{
    Console.WriteLine(nic.Id);
    Console.WriteLine(nic.Name);
    Console.WriteLine(nic.Description);
    Console.WriteLine(nic.NetworkInterfaceType);
    Console.WriteLine(nic.OperationalStatus);
    Console.WriteLine(nic.Speed);

    Console.WriteLine("-----------------------------");
}

GetAllNetworkInterfaces 方法返回描述本地计算机上网络接口的对象。 我们打印可用网络接口的一些属性。

$ dotnet run
lo
lo
lo
Loopback
Up
-1
-----------------------------
wlp0s20f3
wlp0s20f3
wlp0s20f3
Ethernet
Up
-1

C# NetworkInterface MAC 地址

MAC 地址,也称为硬件或物理地址,是用于标识网络上单个电子设备的唯一标识符。

Program.cs
using System.Net.NetworkInformation;

var macs = from nic in NetworkInterface.GetAllNetworkInterfaces()
           where nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
               && nic.OperationalStatus == OperationalStatus.Up
           select nic.GetPhysicalAddress();

Console.WriteLine(macs.FirstOrDefault());

我们使用 GetPhysicalAddress 方法检索 MAC 地址。 我们通过过滤掉 NetworkInterfaceType.Loopback 来跳过 Loopback。

C# NetworkInterface IP 属性

GetIPProperties 方法提供有关 Internet 协议版本 4 (IPv4) 或 Internet 协议版本 6 (IPv6) 的信息。

Program.cs
using System.Net.NetworkInformation;

var ipProps = from nic in NetworkInterface.GetAllNetworkInterfaces()
              where nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
                  && nic.OperationalStatus == OperationalStatus.Up
              select nic.GetIPProperties();

var ipProp = ipProps.First();

Console.WriteLine("IP address & mask");

Console.WriteLine(ipProp.UnicastAddresses.FirstOrDefault()?.Address);
Console.WriteLine(ipProp.UnicastAddresses.FirstOrDefault()?.IPv4Mask);

Console.WriteLine("-----------------------------------");
Console.WriteLine("DNS");

Console.WriteLine(ipProp.DnsSuffix);
Console.WriteLine(string.Join(' ', ipProp.DnsAddresses));

Console.WriteLine("-----------------------------------");
Console.WriteLine("Gateway");

foreach (var e in ipProp.GatewayAddresses)
{
    Console.WriteLine(e.Address);
}

该示例打印 IPv4 地址和掩码以及一些 DNS 和网关信息。

$ dotnet run
IP address & mask
192.168.0.35
255.255.255.0
-----------------------------------
DNS
local
127.0.0.53
-----------------------------------
Gateway
192.168.0.1
fe80::20b:ff:fe00:add0%2

C# NetworkInterface IP 统计信息

使用 GetIPStatistics 方法,我们可以获取本地计算机上网络接口的一些 IP 统计数据。

Program.cs
using System.Net.NetworkInformation;

var ipStats = from nic in NetworkInterface.GetAllNetworkInterfaces()
              where nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
                  && nic.OperationalStatus == OperationalStatus.Up
              select nic.GetIPStatistics();

var ipStat = ipStats.First();

Console.WriteLine(ipStat.BytesReceived);
Console.WriteLine(ipStat.BytesSent);
Console.WriteLine(ipStat.IncomingPacketsWithErrors);
Console.WriteLine(ipStat.OutgoingPacketsWithErrors);
Console.WriteLine(ipStat.IncomingPacketsDiscarded);
Console.WriteLine(ipStat.OutgoingPacketsDiscarded);

该示例打印接收和发送的字节数,以及包含错误和丢弃的数据包数。

来源

NetworkInterface 类 - 语言参考

在本文中,我们使用了 C# 中的网络接口。

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程