C#/.NET을 제대로 배우려고 만든 254칸 바둑판 LAN 스캐너 (Avalonia)
담당 — 개인 학습 프로젝트 — 설계·개발·패키징 전 과정
TypeScript·React·Electron 위주로 써온 스택에서 벗어나 새 언어 하나를 제대로 익히려고 시작한 학습 프로젝트입니다. 교재로는 실제로 쓰고 있던 포터블 툴 faIpScanner(Delphi로 만들어진 블랙박스 exe)를 골라, 바이너리 정적 분석으로 동작 원리(멀티스레드 스윕·SendARP·역DNS)를 밝힌 뒤 C#/.NET 8/Avalonia로 재현했습니다.
서브넷을 병렬 핑 스윕해 254칸 바둑판을 실시간으로 색칠하고(흰=미확인·주황=사용 중·연두=사용 가능), 사용 중인 IP의 PC명을 NetBIOS(UDP 137, 한글 CP949 디코드)와 역DNS로 조회합니다. 결과물로도 실제 전산 자산 파악에 쓰고 있으며, 스캔 대역은 여러 개를 드롭다운으로 오가며 관리합니다.
아래 인스톨러로 설치해 직접 사용해볼 수 있습니다 (자체포함 빌드라 .NET 런타임 설치 불필요, 코드 서명은 없어 SmartScreen 경고가 뜰 수 있습니다). 스크린샷의 IP 대역(192.168.x)과 PC명은 예시 데이터입니다 — 실제 운영 대역·장비명은 노출하지 않기 위해 저장소와 화면 모두에서 예시 값으로 대체했습니다.
실제 운영/실행 화면을 직접 캡처했습니다.
1 / 7지금까지의 주력 스택(TypeScript · React · Electron)에서 한 걸음 나가 새 언어를 제대로 익히고 싶었고, 그 언어로 C#을 골랐습니다. 문법 예제 대신 실제로 매일 쓰던 도구를 교재로 삼기로 하고, 포터블 툴 faIpScanner(Delphi로 만들어진 설치 없는 exe)를 대상으로 정했습니다.
먼저 원본 바이너리를 정적 분석해 동작 원리를 밝혔습니다 — VCL/Indy의 TCheckIPThread·TFindHostNameThread로 대역을 멀티스레드 스윕하고, SendARP(iphlpapi)로 MAC을, 역DNS로 호스트명을 채우는 클래식 LAN 스캐너였습니다. 이 세 동작이 C#의 표준 라이브러리와 Win32 P/Invoke로 거의 1:1 재현 가능하다는 판단이 스택 결정(ADR-0002)의 근거가 되었습니다.
결과물로도 실사용합니다. 관리 중인 네트워크에 지금 어떤 장비가 붙어 있는지(IP·PC명)를 한눈에 보는 전산 자산 파악 용도이며, 스캔 대역은 여러 개를 드롭다운으로 오가며 관리합니다.