SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.AndroidでNICを列挙してみた

【 Xamarin 記事一覧 】

1 Java.Net.NetworkInterface

XamarinによるAndroidプロジェクトでネットワークインターフェースの列挙を書いてみました。

Xamarinは、UIのみJavaSDKの薄いラッパー(C#)で記述し、その他は「共通」という事で、もしかして・・・?とちょっと思ってしまったのですが・・・NICはJavaSDKからでした。

ネットワークインターフェースの一覧は、Windowsであれば、System.Net.NetworkInformationのGetAllNetworkInterfaces()や、iphlpapi.dll(DllImport)のGetInterfaceInfo()ですが、残念ながら、これらは使用できませんでした。

結論から言えば、java.net.NetworkInterfaceのgetNetworkInterfaces()であり、これをC#でラップしたJava.Net.NetworkInterface.NetworkInterfacesを使用することになります。

UI周りの説明と同様、JavaSDKの作法に従えば、そのまま記述できます。

能書きはさておき、せっかく動作したので、覚書として記録しておく事にします。

1

2 NIC一覧


void Refresh(){

    var sb = new StringBuilder(); //出力用バッファ

    var networkInterfaces = NetworkInterface.NetworkInterfaces; // Java.Net.NetworkInterface
    while (networkInterfaces.HasMoreElements){
        var nic = (NetworkInterface) networkInterfaces.NextElement(); //各インターフェースの情報
        if (!nic.IsUp){
            //インターフェースUPのものだけを対象とする
            continue;
        }
        sb.Append(String.Format("[{0}]{1}\r\n", nic.Index, nic.Name)); //インデックス・名前
        sb.Append(String.Format("IsLoopback={0}\r\n", nic.IsLoopback)); //ループバック
        sb.Append(String.Format("IsVirtual={0}\r\n", nic.IsVirtual)); //仮想
        sb.Append(String.Format("MTU={0}\r\n", nic.MTU)); //MTU
        var buf = nic.GetHardwareAddress(); //MAC
        if (buf != null){
            var tmp = new StringBuilder();
            foreach (var b in buf){
                if (tmp.Length != 0){
                    tmp.Append(":");
                }
                tmp.Append(String.Format("{0:X}", b));
            }
            sb.Append(String.Format("HardwareAddress={0}\r\n", tmp));
        }

        //IPアドレス列挙
        var no = 0;
        var addrList = nic.InetAddresses;
        while (addrList.HasMoreElements){
            var next = addrList.NextElement();
            var addrv6 = next as Inet6Address;
            if (addrv6 != null) {//IPv6
                sb.Append(String.Format("    ({0}){1}\r\n", no++, addrv6.HostName));
                sb.Append(String.Format("       HostAddress={0}\r\n", addrv6.HostAddress));//IPアドレス addr.GetAddress()でも可能
                sb.Append(String.Format("       IsMulticastAddress={0}\r\n", addrv6.IsMulticastAddress));//マルチキャスト
                sb.Append(String.Format("       IsLinkLocalAddress={0}\r\n", addrv6.IsLinkLocalAddress));//リンクローカル
                sb.Append(String.Format("       IsSiteLocalAddress={0}\r\n", addrv6.IsSiteLocalAddress));//サイトローカル
                sb.Append(String.Format("       IsAnyLocalAddress={0}\r\n", addrv6.IsAnyLocalAddress)); //エニーローカル
                sb.Append(String.Format("       ScopeId={0}\r\n", addrv6.ScopeId)); //スコープID
            } else{
                var addrV4 = next as Inet4Address;
                if (addrV4 != null) { //IPv4
                    sb.Append(String.Format("    ({0}){1}\r\n", no++, addrV4.HostName));
                    sb.Append(String.Format("       HostAddress={0}\r\n", addrV4.HostAddress));//IPアドレス addr.GetAddress()でも可能
                    sb.Append(String.Format("       IsMulticastAddress={0}\r\n", addrV4.IsMulticastAddress));//マルチキャスト
                }
            }
        }
        sb.Append("\r\n");
    }
    //結果出力
    FindViewById<EditText>(Resource.Id.text).Text = sb.ToString();
}


個人的には、NetworkInterface.NetworkInterfacesや、InetAddressesは、そのままforeachで回せるようにIListなどで返して欲しいところなのですが、律儀にJava.Util.IEnumerationです。

Java.Util.IEnumerationを(HasMoreElements/NextElementを使わずに)簡単にforeachできる方法をご存知の方がおられましたら、是非教えてください m(_._)m

3 実機での出力

エミュレータでは見れなかったIPv6の列挙などが見れます。

(1) Wi-Fi接続時


[1]lo
IsLoopback=True
IsVirtual=False
MTU=16436
    (0)localhost
       HostAddress=::1%1
       IsMulticastAddress=False
       IsLinkLocalAddress=False
       IsSiteLocalAddress=False
       IsAnyLocalAddress=False
       ScopeId=1
    (1)localhost
       HostAddress=127.0.0.1
       IsMulticastAddress=False

[29]wimax0
IsLoopback=False
IsVirtual=False
MTU=1400
HardwareAddress=xx:xx:xx:xx:xx:xx
    (0)fe80::xxxx:88ff:fec1:xxxx%wimax0
       HostAddress=fe80::xxxx:88ff:xxxx:xxxx%wimax0
       IsMulticastAddress=False
       IsLinkLocalAddress=True
       IsSiteLocalAddress=False
       IsAnyLocalAddress=False
       ScopeId=29

[30]wlan0
IsLoopback=False
IsVirtual=False
MTU=1500
HardwareAddress=xx:xx:xx:88:xx:xx
    (0)fe80::xxxx:88ff:fe88:xxxx%wlan0
       HostAddress=fe80::xxxx:88ff:fe88:xxxx%wlan0
       IsMulticastAddress=False
       IsLinkLocalAddress=True
       IsSiteLocalAddress=False
       IsAnyLocalAddress=False
       ScopeId=30
    (1)192.168.0.102
       HostAddress=192.168.0.102
       IsMulticastAddress=False

(2) 3G接続時


[1]lo
IsLoopback=True
IsVirtual=False
MTU=16436
    (0)localhost
       HostAddress=::1%1
       IsMulticastAddress=False
       IsLinkLocalAddress=False
       IsSiteLocalAddress=False
       IsAnyLocalAddress=False
       ScopeId=1
    (1)localhost
       HostAddress=127.0.0.1
       IsMulticastAddress=False

[29]wimax0
IsLoopback=False
IsVirtual=False
MTU=1400
HardwareAddress=FF:7A:FF:FF:76:FF
    (0)fe80::867a:88ff:fec1:7608%wimax0
       HostAddress=fe80::xxxx:xxxx:fec1:xxxx%wimax0
       IsMulticastAddress=False
       IsLinkLocalAddress=True
       IsSiteLocalAddress=False
       IsAnyLocalAddress=False
       ScopeId=29
    (1)10.48.60.119
       HostAddress=10.xx.xx.xx
       IsMulticastAddress=False


※一部編集してます


それにしても、C#で書けるのは、超気持ちイーです。

なんといっても、弱者な私には、VisualStudioで書けることと、Reshaperなどが、そのまま使えているところが一番恩恵を受けているように感じています。

iOSだったら、どうなるんだろう・・・MAC買わなければ。

【 Xamarin 記事一覧 】