ASP.NET Core 프로젝트를 실행하면 아래와 같은 오류가 발생하는 경우가 있습니다.
fail: Microsoft.Extensions.Hosting.Internal.Host[11]
Hosting failed to start
System.IO.IOException: Failed to bind to address https://localhost:8082.
---> System.Net.Sockets.SocketException (10013):
액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다.
특이한 점은 다음과 같습니다:
- 다른 프로세스가 해당 포트를 점유하고 있지 않습니다. (
netstat -ano | findstr :8082결과 없음) - Visual Studio를 재시작하거나, 솔루션을 새로 열어도 동일한 오류가 반복됩니다.
- 포트 번호를 바꾸면 되는 경우도 있고, 안 되는 경우도 있습니다.
이 오류의 실제 원인은 Windows의 TCP 포트 제외 범위(Excluded Port Range) 입니다.
Windows에서 Hyper-V가 활성화되어 있으면 (WSL2, Docker Desktop, Windows Sandbox 등을 사용하는 경우 자동으로 활성화됨), winnat 서비스가 동적으로 특정 포트 범위를 예약합니다. 이 범위에 포함된 포트는 어떤 프로세스도 바인딩할 수 없습니다.
핵심은 프로세스 단위 점유가 아니라 OS 수준의 예약이라는 점입니다. 따라서 netstat으로는 확인되지 않고, 재부팅 후에도 범위가 다시 할당되면 동일한 문제가 재발합니다.
문제를 확인하기 위해 PowerShell 또는 명령 프롬프트에서 아래 명령을 실행합니다:
netsh interface ipv4 show excludedportrange protocol=tcp
출력 예시:
프로토콜 tcp 포트 제외 범위
시작 포트 끝 포트
---------- --------
5357 5357
5985 5985
6441 6540
6884 6983
7640 7739
7740 7839
8040 8139 ← 8080, 8082 모두 이 범위에 포함!
8140 8239
9765 9765
50000 50059 *
* - 관리 포트 제외입니다.
위 예시에서 8040~8139 범위가 예약되어 있으므로, launchSettings.json에 설정된 포트 8080과 8082가 모두 차단된 것입니다.
해결 방법 1: 제외 범위를 피해 포트 변경 (가장 간단)
Properties/launchSettings.json에서 제외 범위에 걸리지 않는 포트로 변경합니다.
{
"profiles": {
"https": {
"applicationUrl": "https://localhost:5201;http://localhost:5200"
}
}
}
5000~5300 범위는 ASP.NET Core가 전통적으로 사용하는 포트 대역이라 비교적 안전합니다.
해결 방법 2: 특정 포트를 영구 예약하여 winnat이 가져가지 못하게 방지
관리자 권한 PowerShell에서:
# 1. Hyper-V를 잠시 비활성화 (재부팅 필요)
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
# 2. 재부팅 후, 원하는 포트를 먼저 예약
netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=10
# 3. Hyper-V 다시 활성화 (재부팅 필요)
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
이 방법은 Hyper-V가 해당 범위를 가져가기 전에 사용자가 먼저 예약해두는 원리입니다. 다만, Hyper-V 비활성화/활성화를 위해 재부팅이 두 번 필요합니다.
.NET 프로젝트 템플릿에서 생성하는 기본 포트(5000대)를 그대로 사용하면 잘 안 걸리지만, 다음과 같은 상황에서 빈번하게 발생합니다:
- Docker/컨테이너 연동을 위해
8080,8081등으로 포트를 변경한 경우 - 여러 프로젝트를 동시에 실행하기 위해 포트를 분산 배치한 경우
- 팀에서 공유하는
launchSettings.json에 특정 포트가 고정된 경우
특히 Windows 업데이트나 WSL2/Docker Desktop 업데이트 후 제외 범위가 달라질 수 있어, 어제까지 잘 되던 프로젝트가 갑자기 안 되는 상황이 발생합니다.
정리
| 항목 | 내용 |
|---|---|
| 에러 코드 | SocketException (10013) / WSAEACCES |
| 에러 메시지 | 액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다 |
| 원인 | Windows winnat 서비스의 TCP 포트 제외 범위 |
| 발생 조건 | Hyper-V 활성화 상태 (WSL2, Docker Desktop 등) |
| 진단 명령 | netsh interface ipv4 show excludedportrange protocol=tcp |
| 해결 | 제외 범위 밖의 포트 사용, 또는 포트 영구 예약 |
포트 충돌이 의심될 때
netstat만 확인하지 마시고,netsh interface ipv4 show excludedportrange protocol=tcp도 함께 확인해 보세요. 이 명령 하나로 많은 시간을 절약할 수 있습니다.
이 아티클은 AI의 도움을 받아 작성된 글입니다,