본문 바로가기
C#

SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법

by 공부봇 2025. 1. 10.
반응형

System.Net.Sockets.SocketException: '각 소켓 주소(프로토콜/네트워크 주소/포트)는 하나만 사용할 수 있습니다' 에러는 특정 IP 주소와 포트 조합이 이미 사용 중일 때 발생합니다. 이는 소켓이 특정 네트워크 주소와 포트를 독점적으로 바인딩하기 때문입니다.


주요 원인

  1. 소켓이 이미 실행 중인 경우
    • 동일한 IP와 포트를 사용하는 다른 소켓이 이미 실행 중일 수 있습니다.
    • 이전 실행 중이던 서버 소켓이 제대로 종료되지 않은 상태일 수 있습니다.
  2. 포트 충돌
    • 동일한 포트를 사용하는 다른 애플리케이션이 실행 중일 수 있습니다.
  3. 빠른 재시작 문제
    • 서버를 중지하고 바로 다시 시작하면, 운영 체제가 포트를 재사용하지 못하게 막는 경우가 있습니다. 이는 TIME_WAIT 상태 때문입니다.
  4. 잘못된 바인딩
    • 올바르지 않은 IP 주소나 잘못된 포트를 바인딩하려 할 경우 발생할 수 있습니다.

해결 방법

1. 포트 충돌 확인

  • 동일한 포트를 사용 중인 애플리케이션이 있는지 확인합니다.
  • Windows의 경우, 아래 명령어를 통해 포트를 사용하는 프로세스를 확인할 수 있습니다:
    netstat -ano | findstr :포트번호
    
    특정 프로세스를 종료하려면:
    taskkill /PID 프로세스ID /F
    

2. 소켓 종료 처리 확인

  • 서버 애플리케이션을 종료할 때 소켓을 올바르게 닫고 해제했는지 확인하세요.
tcpListener.Stop(); // TCPListener 종료
socket.Close();     // 소켓 종료

3. SO_REUSEADDR 설정 사용

  • 소켓의 ReuseAddress 속성을 활성화하면, 포트를 재사용할 수 있습니다.
TcpListener listener = new TcpListener(IPAddress.Any, 5000);
listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Start();

4. 다른 포트 사용

  • 문제가 되는 포트 대신 다른 포트를 사용해 충돌을 피합니다.

5. TIME_WAIT 상태 방지

  • SO_REUSEADDR 설정이 없으면, 서버를 재시작하기 전에 운영 체제가 포트를 해제하는 시간을 기다려야 합니다.

6. 올바른 IP와 포트 확인

  • 바인딩하려는 IP 주소가 실제 네트워크 인터페이스에 존재하는지 확인합니다.
  • 예: 127.0.0.1은 로컬 머신에서만 작동합니다.

추가 디버깅 방법

  • 예외가 발생하는 구체적인 코드를 확인하세요.
  • 로그를 추가하여 서버 소켓이 중복으로 생성되는 경우가 있는지 확인합니다.

위의 해결 방법을 적용하면 해당 오류를 방지할 수 있을 것입니다. 😊

반응형