[C#] MAC Address 가져오기

C# 2020. 6. 15. 23:51

Trading 시스템을 만들면서 사용자 인증방식을 지정된 단말로만 가능하도록

'MAC 인증' 방식을 택했다.

 

물론 내가 C#을 처음써서인 것도 있겠지만, MAC 주소를 읽어올때 마다 값이 다른 것을 확인했다.

이유인 즉, PC에 설치된 VPN...가상 환경 때문이었다.

 

구글링 결과 C#에서 기본적인 단말 MAC 주소를 가져오는 로직은 NetworkInterface들중에 0번째 것을 가져오도록 하는 소스가 대부분이었다. 

 

[ 방법 1 ]

string mac = string.Empty;
mac = NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString();

가상 환경이 설치되어 있는 PC의 경우, 해당 가상환경 사용중인 여부에 따라 값이 다르게 읽어지는 것을 확인했다.

 

그래서 찾은 방법은 현재 상태가 사용중인 네트워크 어댑터의 MAC 주소를 가져오는 것.

 

[ 방법 2 ]

var macAddr =
    (
        from nic in NetworkInterface.GetAllNetworkInterfaces()
        where nic.OperationalStatus == OperationalStatus.Up
        select nic.GetPhysicalAddress().ToString()
    ).FirstOrDefault();

OperationalStatus가 "Up"으로 설정되어 있는 놈을 가져오는 것이다. 

위의 경우에도 현재 시스템의 상태에 따라 정확하게 MAC 주소를 가져오는 것을 확인했다.

실제 물리적 네트워크 어댑터만 사용 중

[ 방법 1 ]을 사용했을 때는 '이더넷 3'인 가상 네트워크 어댑터의 MAC주소를 가져왔지만, [ 방법 2 ]를 사용했을 경우에는 현재 사용중인 '이더넷 2' 네트워크 어댑터의 MAC주소를 가져왔다.

 

하지만, 가상환경도 함께 연결되어 있는 경우, 보다 정확하게 하기 위해 현재 데이터 송/수신량까지 확인하여 가장 많이 사용되고 있는 네트워크 어댑터의 MAC 주소를 가져오는 방식을 사용하는 방법도 있다. 

가상환경 네트워크 어댑터 동시 사용 중

[ 방법 3 ]

Dictionary<string, long> macAddresses = new Dictionary<string, long>();
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
    if (nic.OperationalStatus == OperationalStatus.Up)
        macAddresses[nic.GetPhysicalAddress().ToString()] = nic.GetIPStatistics().BytesSent + nic.GetIPStatistics().BytesReceived;
}

long maxValue = 0;
string mac = "";
foreach(KeyValuePair<string, long> pair in macAddresses)
{
   if(pair.Value > maxValue)
    {
        mac = pair.Key;
        maxValue = pair.Value;
    }
}

먼저 딕셔너리에 네트워크 어댑터들의 MAC 주소와 데이터 송/수신량을 쌍(Pair)로 저장 후,

비교하여 송/수신량이 가장 많은 MAC 주소를 가져오는 로직이다. 

 

아래 웹 페이지에 MAC 주소를 가져오는 다양한 방법이 기술되어 있으니, 본인의 개발 방향과 맞는 방법을 사용하면 좋을 것 같다.

 

[ 출처 ]

https://www.it-swarm.dev/ko/c%23/c-%EC%97%90%EC%84%9C-%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98-mac-%EC%A3%BC%EC%86%8C%EB%A5%BC-%EC%96%BB%EB%8A%94-%EC%95%88%EC%A0%95%EC%A0%81%EC%9D%B8-%EB%B0%A9%EB%B2%95/957550098/

Posted by [ 브랜든 ]
,