(C++) WlanAPI를 이용한 Wi-Fi MAC 주소 검출
접속한 AP의 MAC(BSSID)을 뽑는 코드. 이게 내 어댑터 MAC이 아니라는 점, 같은 장비인데 대역마다 BSSID가 다른 점, 로컬 관리 비트로 임의 주소를 구분하는 법까지 정리했다.
접속한 AP의 MAC(BSSID)을 뽑는 코드. 이게 내 어댑터 MAC이 아니라는 점, 같은 장비인데 대역마다 BSSID가 다른 점, 로컬 관리 비트로 임의 주소를 구분하는 법까지 정리했다.
WlanQueryInterface로 현재 연결 정보를 직접 받아오는 방법. 연결이 없을 때 나는 에러, 프로필 이름과 실제 SSID의 차이, 신호 품질 값을 dBm으로 되돌리는 식까지 정리했다.
재미로 짠 코드인데 정리하다 보니 rand() 대신
리눅스 명령 출력을 프로그램 변수로 받는 세 가지 방법을 비교했다. popen이 간단한 이유와 그 대가, fork/exec/pipe를 직접 짤 때 빠뜨리기 쉬운 exit·버퍼 경계·strtok 문제까지 정리했다.
검사 결과를 콘솔에 표로 찍으려고 setw를 썼는데, setw가 바이트를 센다는 것과 한글이 섞이면 코드페이지에 따라 정렬이 무너진다는 것을 나중에 알았다. 그 과정과 대안을 정리했다.
WSAGetLastError가 뱉는 숫자를 사람이 읽는 문장으로 바꾸는 FormatMessage 사용법과, 유니코드 빌드에서 메시지가 깨지는 문제·메시지 끝에 붙는 개행·실패 시 LocalFree가 터지는 문제까지 정리했다.
시리얼 번호로 결과 파일명을 만드는 데 CString::Format과 sprintf_s를 써봤다. 유니코드 빌드에서 std::string을 %s로 넘기면 깨지는 문제, sprintf_s가 넘칠 때 자르는 게 아니라 죽는 문제까지 정리했다.
결과 파일이 덮어써지는 걸 막으려고 번호를 하나씩 올려가며 빈 이름을 찾는 코드를 짰다. 잘 돌긴 했는데 파일이 쌓이면 느려지고, 프로그램을 두 개 띄우면 같은 번호를 쓴다. 그 두 문제를 어떻게 정리했는지 남긴다.
Native WiFi API로 접속 중인 Wi-Fi 이름을 처음 뽑아본 기록. WlanGetAvailableNetworkList에서 dwIndex를 인덱스로 쓴 게 틀렸다는 걸 나중에 알았고, 연결된 항목을 어떻게 골라야 하는지까지 정리했다.
가중치 그래프에서 최단 경로를 구하는 다익스트라 알고리즘의 동작 원리를 정리하고, 6개 정점 인접행렬 그래프 예제로 C# 구현을 살펴본다.