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 주소를 가져오는 다양한 방법이 기술되어 있으니, 본인의 개발 방향과 맞는 방법을 사용하면 좋을 것 같다.
[ 출처 ]
'C#' 카테고리의 다른 글
[C#] 다른 파일, 다른 클래스 값/함수 사용 (1) | 2020.06.28 |
---|---|
[C#] delegate, 폼 간의 DATA 공유 (2) | 2020.06.20 |
[C#] Class, 클래스, 구조체 (0) | 2020.06.08 |
[C#] 팝업창, 새로운 Form 열기, 모달vs모달리스 (0) | 2020.06.01 |
[C#] 값을 표현하기 위한 방법 (0) | 2020.05.28 |