개요
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


