C# - 유선 IPv4 Address 구하기


개요

Windows Vista 이후 버전에서는 IPv6를 기본 지원하고 있어서
하나의 Network Adapter에 복수개의 IP Address가 존재할 수 있습니다.
거기다 유선랜과 무선랜을 같이 쓰게되면 제가 원하는 '유선랜 IPv4 Address'를 구하기 애매하여
WMI를 사용하여 IP Address를 구하는 메소드를 작성하였습니다.

이를 위해 System.Management 를 '참조추가' 하여야 되구요..
기존에 포스팅한 http://kimstar.pe.kr/blog/168 도 참고하시기 바랍니다.

테스트 환경

  • Windows XP sp3
  • Windows 7 Enterprise

소스코드

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Management;

namespace IPv4Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("모든 IPv4 주소----------------");
            foreach (string s in GetAllIPv4Address())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("n유선 IPv4 주소----------------");
            foreach (string s in GetWiredIPv4Address())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("n무선 IPv4 주소----------------");
            foreach (string s in GetWirelessIPv4Address())
            {
                Console.WriteLine(s);
            }
        }


        /// <summary>
        /// 모든 IPv4 Address 구하기
        /// </summary>
        /// <returns>IPv4 Address 문자열 배열</returns>
        public static string[] GetAllIPv4Address()
        {
            List<string> ipv4s = new List<string>();
            Regex regex = new Regex(@"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$");

            foreach (System.Net.IPAddress ip in System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList)
            {
                if (regex.IsMatch(ip.ToString()))
                {
                    ipv4s.Add(ip.ToString());
                }
            }

            return ipv4s.ToArray();
        }

        /// <summary>
        /// 유선 IPv4 Address 구하기
        /// </summary>
        /// <returns>유선 IPv4 Address 문자열 배열</returns>
        public static string[] GetWiredIPv4Address()
        {
            return GetIPv4Address(true);
        }

        /// <summary>
        /// 무선 IPv4 Address 구하기
        /// </summary>
        /// <returns>무선 IPv4 Address 문자열 배열</returns>
        public static string[] GetWirelessIPv4Address()
        {
            return GetIPv4Address(false);
        }

        /// <summary>
        /// 유선 or 무선 IPv4 Address 구하기
        /// </summary>
        /// <param name="wired">유선을 찾고 싶으면 true</param>
        /// <returns>IPv4 Address 문자열 배열</returns>
        public static string[] GetIPv4Address(bool wired)
        {
            // IPv4 검사할 정규식
            Regex regex = new Regex(@"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$");

            List<string> ipv4s = new List<string>();
            string[] wifiNames = GetWifiNetAdapterNames();

            try
            {
                ManagementObjectSearcher objSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'");
                ManagementObjectCollection objCollection = objSearcher.Get();

                foreach (ManagementObject obj in objCollection)
                {
                    // wired값에 따라 무선 or 유선인것만 찾기
                    if (wired && Array.IndexOf(wifiNames, (string)obj["Description"]) < 0 || !wired && Array.IndexOf(wifiNames, (string)obj["Description"]) > -1)
                    {
                        foreach (string address in (string[])obj["IPAddress"])
                        {
                            if (regex.IsMatch(address) && address != "0.0.0.0")
                            {
                                ipv4s.Add(address);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error : " + ex.ToString());
            }

            // 반환
            return ipv4s.ToArray();
        }

        /// <summary>
        /// 무선 Network Adapter 이름 구하기
        /// </summary>
        /// <returns>무선 Network Adapter 문자열 배열</returns>
        public static string[] GetWifiNetAdapterNames()
        {
            List<string> names = new List<string>();

            try
            {
                ObjectQuery query = new ObjectQuery("SELECT * FROM MSNdis_80211_ReceivedSignalStrength Where active = true");
                ManagementScope scope = new ManagementScope("rootwmi");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

                foreach (ManagementObject obj in searcher.Get())
                {
                    if ((bool)obj["Active"] == true)
                    {
                        names.Add((string)obj["InstanceName"]);
                    }
                }
            }
            catch (ManagementException mex)
            {
                if (mex.ErrorCode != ManagementStatus.NotSupported)
                {
                    Console.WriteLine("Error : " + mex.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error : " + ex.ToString());
            }

            return names.ToArray();
        }

    }
}

결과

모든 IPv4 주소----------------
10.1.7.72
10.1.10.140

유선 IPv4 주소----------------
10.1.10.140

무선 IPv4 주소----------------
10.1.7.72

 

광고

댓글 남기기