Microsoft .NET/ASP.Net & ASP.Net Core
[ASP.NET Core] Kestrel "Failed to bind to address" 오류, 포트 점유 해결
전자기린
2026. 11. 10. 00:23

Kestrel이 지정한 포트를 이미 다른 프로세스가 잡고 있어서 발생하는 IOException과 해결 방법입니다.
절차
- 에러 메시지 확인
- 포트를 점유한 프로세스 찾기
- 해결 1: 점유 프로세스 종료
- 해결 2: 포트 변경
- 개발 환경에서 자주 있는 케이스
1. 에러 메시지
System.IO.IOException: Failed to bind to address http://127.0.0.1:5000: address already in use.
---> System.Net.Sockets.SocketException (98): Address already in use앱이 뜨지 않고 콘솔에 위 메시지가 찍히면, 코드 문제가 아니라 포트 충돌입니다.
2. 포트를 점유한 프로세스 찾기
Windows
netstat -ano | findstr :5000
tasklist /FI "PID eq 12345"Linux / macOS
lsof -i :5000
ss -ltnp | grep 5000출력에서 LISTENING 상태인 PID를 확인합니다. 아무것도 안 나오면 그 포트는 비어 있는 것이므로, 앱 쪽 설정을 다시 봐야 합니다.
PowerShell에서 한 번에
Get-NetTCPConnection -LocalPort 5000 | Select-Object LocalAddress,State,OwningProcess
3. 해결 1: 점유 프로세스 종료
정체를 확인한 뒤 종료합니다. 이전에 띄워 둔 같은 앱인 경우가 대부분입니다.
# Windows
taskkill /PID 12345 /F
# Linux / macOS
kill -9 12345
4. 해결 2: 포트 변경
그 포트를 반드시 써야 하는 다른 앱이 있다면, 내 앱 쪽 포트를 바꿉니다.
1) launchSettings.json (개발 환경)
{
"profiles": {
"MyApp": {
"commandName": "Project",
"applicationUrl": "https://localhost:5001;http://localhost:5100"
}
}
}2) 실행할 때 직접 지정
dotnet run --urls "http://localhost:5100"3) 코드에서 고정
builder.WebHost.UseUrls("http://localhost:5100");운영에서는 ASPNETCORE_URLS 환경 변수나 리버스 프록시(Nginx·IIS) 뒤에서 내부 포트만 맞추는 방식을 주로 씁니다.
5. 개발 환경에서 자주 있는 케이스
- 중지했는데 프로세스가 살아 있음 — 작업 관리자에서
MyApp.exe,dotnet.exe확인 dotnet watch를 창 두 개에서 동시에 실행- Docker가
-p 5000:80으로 이미 매핑 중 - IIS Express가 44300~44399 포트를 예약
정리
- 문구 그대로
netstat -ano | findstr :5000으로 PID 확인 - 내 이전 프로세스면 종료, 다른 앱이면 포트 변경
- 코드 문제가 아니므로 롤백·재설치로 시간 쓰지 않기