Windows에서 포트 충돌 에러(EADDRINUSE)를 겪을 때 netstat -ano 명령어 없이 GUI로 포트를 확인하고 프로세스를 종료할 수 있는 무료 데스크톱 앱, PortManager를 소개합니다. 설치 없이 exe 하나로 실행할 수 있으며, Electron 기반으로 직접 개발했습니다.
EADDRINUSE란?
EADDRINUSE는 "Error: Address Already In Use"의 약자로, 네트워크 프로그래밍에서 발생하는 에러 코드입니다.
쉽게 말하면
내가 사용하려는 포트 번호를 다른 프로세스가 이미 점유하고 있을 때 발생하는 에러입니다.
예를 들어 설명하면 이렇습니다.
카페에 콘센트 자리가 하나 있는데, 이미 누가 앉아 있으면 내가 거기 앉을 수 없는 것과 같습니다. 포트도 마찬가지로, 하나의 포트를 두 프로그램이 동시에 사용할 수 없습니다.
실제 에러 메시지
Node.js로 서버를 실행할 때 가장 흔하게 볼 수 있습니다.
Error: listen EADDRINUSE: address already in use :::3000
이 메시지는 "3000번 포트를 이미 누군가 쓰고 있어서 서버를 시작할 수 없다"는 뜻입니다.
왜 발생하나?
주요 원인은 다음과 같습니다.
원인상황| 서버 중복 실행 | 이전에 실행한 서버를 종료하지 않고 다시 npm start 한 경우 |
| 비정상 종료 | Ctrl+C 없이 터미널을 그냥 닫아서 프로세스가 백그라운드에 남아 있는 경우 |
| 다른 앱이 같은 포트 사용 | 예: 3000번 포트를 Node.js와 다른 앱이 동시에 쓰려는 경우 |
해결 방법
기존에는 아래 명령어를 매번 수동으로 입력해야 했습니다.
# 1단계: 3000번 포트를 점유 중인 프로세스 PID 확인
netstat -ano | findstr :3000
# 2단계: 해당 PID의 프로세스 종료
taskkill /F /PID 1234
PortManager가 바로 이 과정을 GUI에서 클릭 한 번으로 해결하기 위해 만들어진 앱입니다. 포트 목록에서 충돌이 발생한 포트를 찾고, Kill 버튼을 누르면 해당 프로세스가 종료되어 포트가 해제됩니다.
요약
항목내용| 정식 명칭 | EADDRINUSE (Error: Address Already In Use) |
| 의미 | 사용하려는 포트가 이미 다른 프로세스에 의해 점유된 상태 |
| 발생 환경 | Node.js, Python, Java 등 네트워크 서버 실행 시 공통 |
| 핵심 해결 | 해당 포트를 점유 중인 프로세스를 찾아 종료하면 해결 |
💾 다운로드: PortManager 릴리즈 페이지
📂 GitHub: hayohio-bit/PortManager
왜 만들었나: 포트 충돌, 매번 netstat 치기 귀찮다
개발하다 보면 이런 에러를 자주 만납니다.
Error: listen EADDRINUSE: address already in use :::3000
이 에러가 뜰 때마다 해야 하는 작업은 항상 같습니다.
netstat -ano | findstr :3000으로 PID 확인tasklist로 프로세스 이름 확인taskkill /F /PID xxxx로 종료
세 번의 명령어를 매번 반복하는 것이 번거로워서, 이 과정을 클릭 한 번으로 해결하는 GUI 앱을 만들어봤습니다.
주요 기능
| 기능 | 설명 |
|---|---|
| 실시간 포트 조회 | LISTEN 중인 TCP/UDP 포트를 전체 목록으로 표시 |
| 통합 검색 | 포트 번호, 프로세스 이름, PID, 주소를 한 번에 검색 (디바운싱 200ms) |
| 프로토콜 필터 | 전체 / TCP / UDP 탭으로 빠르게 필터링 |
| 컬럼 정렬 | 프로토콜, 주소, 포트, PID, 프로세스 이름 기준 오름/내림차순 |
| 원클릭 프로세스 종료 | Kill 버튼 → 확인 모달 → 강제 종료 (taskkill /F) |
| 시스템 프로세스 보호 | Windows 커널 프로세스(PID 4 등) 종료 차단 |
| 토스트 알림 | 성공/실패 결과를 화면 우측 하단에 3초간 표시 |
| 포터블 실행 | 설치 없이 exe 하나로 즉시 실행 |
💡 이런 분들에게 추천합니다
netstat 명령어에 익숙하지 않은 분
포트 점유 프로세스를 빠르게 확인하고 종료하고 싶은 분
다운로드 및 실행 방법
시스템 요구사항
- Windows 10 / 11 (x64)
- 일반 사용자 권한으로 실행 가능 (프로세스 종료 시에만 UAC 요청)
설치 및 실행
- 릴리즈 페이지에서
PortManager 1.0.0 Portable.exe다운로드 - 파일을 더블클릭하여 실행
- 앱이 열리면 포트 목록이 자동으로 로드됩니다
- 프로세스 종료 시 UAC 창이 나타납니다. "예"를 클릭하면 해당 프로세스만 관리자 권한으로 종료됩니다
⚠️ Windows SmartScreen 경고가 뜨는 경우:
코드 서명이 없는 exe에서 발생합니다. "추가 정보" → "실행"을 클릭하면 정상 실행됩니다.
사용 화면

앱 레이아웃:
⚡ Port Manager [127개 포트] [🔄 새로고침]
🔍 [포트 번호 또는 프로세스 이름으로 검색...]
[전체] [TCP] [UDP]
프로토콜 | 주소 | 포트 | PID | 프로세스 | 작업
TCP | 0.0.0.0 | 3000 | 1234 | node.exe | [종료]
TCP | 0.0.0.0 | 5432 | 5678 | postgres | [종료]
UDP | 0.0.0.0 | 5353 | 912 | svchost | [종료]
기술 스택
| 항목 | 내용 |
|---|---|
| 프레임워크 | Electron 33 |
| 언어 | JavaScript (Node.js 20+) |
| 포트 조회 | netstat -ano + tasklist (UTF-8 강제) |
| 프로세스 종료 | PowerShell Start-Process -Verb RunAs + taskkill |
| 빌드 도구 | electron-builder 25 |
| 배포 형태 | Portable EXE (설치 불필요) |
핵심 구현 설명
포트 조회: netstat + tasklist 병렬 실행
netstat -ano와 tasklist를 Promise.all로 병렬 실행한 뒤, PID를 기준으로 매핑합니다. chcp 65001을 선행 실행하여 한글 Windows(CP949)에서도 UTF-8 출력을 보장합니다.
const [netstatResult, processMap] = await Promise.all([
execAsync('chcp 65001 >nul 2>&1 && netstat -ano', { shell: true }),
getProcessMap(),
]);
권한 모델: Hybrid Elevation
앱 자체는 asInvoker로 실행되어 UAC 차단 없이 즉시 시작됩니다. 프로세스 종료 시에만 PowerShell RunAs 동사로 해당 명령에 한해 관리자 권한을 요청합니다.
const command = `powershell -Command "Start-Process cmd -ArgumentList '/c taskkill /F /PID ${safePid}' -Verb RunAs -WindowStyle Hidden -Wait"`;
await execAsync(command);
보안 설계
- 렌더러 격리:
contextIsolation: true,nodeIntegration: false,sandbox: true - IPC 화이트리스트:
contextBridge를 통해getPorts(),killProcess()두 개 API만 노출 - 커맨드 인젝션 방지: PID 입력값을 정수로 검증 후 사용
- 시스템 프로세스 보호: PID 4(Windows 커널) 등 보호 목록에 포함된 프로세스 종료 차단
- CSP 적용: 인라인 스크립트, 외부 리소스 로딩 차단
프로젝트 구조
PortManager/
├── main.js # Electron 메인 프로세스 (윈도우 생성, IPC 핸들러)
├── preload.js # contextBridge IPC 브릿지
├── src/
│ └── services/
│ └── portService.js # netstat / tasklist 파싱, 프로세스 종료
└── renderer/
├── index.html # 앱 레이아웃
├── css/style.css # 스타일
├── js/app.js # 검색/필터/정렬/모달/토스트 로직
└── fonts/ # @fontsource/inter 오프라인 폰트
FAQ
Q. netstat로 직접 확인하는 것과 뭐가 다른가요?
A. netstat은 텍스트 출력이라 PID를 찾고, tasklist로 프로세스 이름을 다시 확인하고, taskkill로 종료하는 세 단계를 거쳐야 합니다. PortManager는 이 과정을 하나의 화면에서 검색, 확인, 종료까지 원클릭으로 처리합니다.
Q. 관리자 권한 없이도 사용할 수 있나요?
A. 포트 목록 조회는 일반 사용자 권한으로 가능합니다. 프로세스 종료 시에만 UAC 확인 창이 나타납니다.
Q. SmartScreen 경고는 왜 뜨나요?
A. 코드 서명이 없는 exe 파일에서 발생하는 일반적인 경고입니다. "추가 정보" → "실행"을 클릭하면 됩니다.
Q. 시스템 프로세스를 실수로 종료할 위험은 없나요?
A. Windows 커널 프로세스(PID 4 등)는 앱 내부에서 종료가 차단되며, 모든 종료 작업에 확인 모달이 표시됩니다.
마무리
포트 충돌은 개발 중 자주 마주치는 문제입니다. 기존에는 커맨드라인에서 여러 명령어를 조합해야 했지만, PortManager를 사용하면 GUI에서 클릭 한 번으로 해결할 수 있습니다. 버그 리포트, 기능 제안, PR 모두 환영합니다.
📥 다운로드: PortManager v1.0.0
🔗 GitHub: hayohio-bit/PortManager