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. 포트를 점유한 프로세스 찾기
  3. 해결 1: 점유 프로세스 종료
  4. 해결 2: 포트 변경
  5. 개발 환경에서 자주 있는 케이스

 

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. 개발 환경에서 자주 있는 케이스

  1. 중지했는데 프로세스가 살아 있음 — 작업 관리자에서 MyApp.exe, dotnet.exe 확인
  2. dotnet watch를 창 두 개에서 동시에 실행
  3. Docker가 -p 5000:80으로 이미 매핑 중
  4. IIS Express가 44300~44399 포트를 예약

 

정리

  1. 문구 그대로 netstat -ano | findstr :5000으로 PID 확인
  2. 내 이전 프로세스면 종료, 다른 앱이면 포트 변경
  3. 코드 문제가 아니므로 롤백·재설치로 시간 쓰지 않기