피드로 돌아가기
Dev.toInfrastructure
원문 읽기
488KB 정적 바이너리로 구현한 3대 OS 통합 Port Finder 설계
A Cross-OS Port Finder in Rust — One CLI, Three Completely Different Data Formats
AI 요약
Context
OS별로 상이한 네트워크 소켓 조회 명령어와 출력 데이터 포맷으로 인해 발생하는 디버깅 효율 저하 해결 필요. 기존의 lsof, ss, netstat 등은 실행 옵션과 결과 형식이 완전히 달라 크로스 플랫폼 환경의 단일 인터페이스 구축이 어려운 상황.
Technical Solution
- #[cfg(target_os)] 속성을 활용한 빌드 타임 플랫폼별 백엔드 분리 및 단일 Listener 모델로의 데이터 정규화
- macOS의 lsof -F 옵션을 활용한 태그 기반 상태 머신(State Machine) 파서를 설계하여 가변 길이 데이터의 파싱 정확도 확보
- Linux의 /proc/net/tcp 파일 시스템 직접 분석을 통한 런타임 오버헤드 제거 및 Little-endian 호스트 대응 Hex 디코딩 로직 구현
- Windows netstat의 컬럼 기반 출력물과 tasklist의 CSV 포맷을 결합한 프로세스 매핑 구조 설계
- Dual-stack(IPv4/IPv6) 소켓의 중복 표기 문제를 해결하기 위한 주소 패밀리 추적 및 와일드카드(*) 주소 재작성 로직 도입
- 외부 C 라이브러리 의존성을 완전히 배제한 Rust 기반 정적 바이너리 컴파일로 배포 편의성 극대화
실천 포인트
- OS별 시스템 호출 결과가 다를 경우, 빌드 타임 조건부 컴파일(Conditional Compilation)을 통해 플랫폼별 구현체 분리 - 가변적인 텍스트 로그 파싱 시 단순 정규표현식보다 상태 머신(State Machine) 기반의 파서 설계 고려 - 네트워크 도구 설계 시 IPv4와 IPv6의 Dual-stack 바인딩 여부를 명확히 구분하여 리소스 누수 방지