Grow up

生活とプログラミング

C# MACアドレスを読み込む

はじめに

ネットワークに接続する機器の一意の識別情報について調べた内容をまとめます。

一意の識別情報はMACアドレス

ネットワークに接続する機器は48ビットのアドレス(MACアドレス)で識別する。
MACアドレスはネットワークインターフェースごとに割り当てられる。
48ビットのMACアドレスの上位24ビットは製造メーカーごとに固有の値、下位24ビットは製造メーカーが自社製品に一意な値を割り当てる。
従ってネットワークインターフェイスは世界で1つだけのMACアドレスを持つ。

MACアドレスを読み込んだ結果

私のパソコンではネットワークインターフェースが7つ認識されました。
赤線で消しているところがMACアドレスになります。
f:id:knkomko:20190315005416p:plain:w300

MACアドレスを読み込むソースコード

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

public static void ShowNetworkInterfaces()
{
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
    if (nics == null || nics.Length < 1)
    {
        Console.WriteLine("  No network interfaces found.");
        return;
    }

    Console.WriteLine("  インターフェースの数");
    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("  インタフェースの種類");
        Console.WriteLine("  Interface type ..................... : {0}", 
            adapter.NetworkInterfaceType);
        Console.WriteLine("  MACアドレス・物理アドレス");
        Console.WriteLine("  Physical Address ................... : {0}",
            adapter.GetPhysicalAddress().ToString());
        Console.WriteLine("  ネットワーク接続の現在の操作状態");
        Console.WriteLine("  Operational status ................. : {0}",
            adapter.OperationalStatus);

        string versions = "";
        // 表示するIPアドレスのバージョンを判別する
        if (adapter.Supports(NetworkInterfaceComponent.IPv4))
        {
            versions = "IPv4";
        }
        if (adapter.Supports(NetworkInterfaceComponent.IPv6))
        {
            if (versions.Length > 0)
            {
                versions += " ";
            }
            versions += "IPv6";
        }
        Console.WriteLine("  IPアドレスのバージョン");
        Console.WriteLine("  IP version ......................... : {0}",
            versions);

        // The following information is not useful for loopback adapters.
        if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback)
        {
            continue;
        }
        Console.WriteLine(" ドメイン名末尾の識別子");
        Console.WriteLine("  DNS suffix ......................... : {0}",
            properties.DnsSuffix);

        string label;
        if (adapter.Supports(NetworkInterfaceComponent.IPv4))
        {
            IPv4InterfaceProperties ipv4 = properties.GetIPv4Properties();
            Console.WriteLine("  IPデータグラムの長さ");
            Console.WriteLine("  MTU................................. : {0}",
                ipv4.Mtu);
            if (ipv4.UsesWins)
            {
                IPAddressCollection winsServers = properties.WinsServersAddresses;
                if (winsServers.Count > 0)
                {
                    label = "  WINS Servers ....................... :";
                }
            }
        }
        
        Console.WriteLine("  DNSの名前解決を使用するのか");
        Console.WriteLine("  DNS enabled ........................ : {0}",
            properties.IsDnsEnabled);
        Console.WriteLine("  DNSを使用して取得したIPアドレスを登録するのか");
        Console.WriteLine("  Dynamically configured DNS ......... : {0}",
            properties.IsDynamicDnsEnabled);
        Console.WriteLine("  データパケットの受信だけを行うのか");
        Console.WriteLine("  Receive Only ....................... : {0}",
            adapter.IsReceiveOnly);
        Console.WriteLine("  マルチキャストパケットの受信が有効か");
        Console.WriteLine("  Multicast .......................... : {0}",
            adapter.SupportsMulticast);
        Console.WriteLine();
    }
}