반응형
System.Net.Sockets.SocketException: '각 소켓 주소(프로토콜/네트워크 주소/포트)는 하나만 사용할 수 있습니다' 에러는 특정 IP 주소와 포트 조합이 이미 사용 중일 때 발생합니다. 이는 소켓이 특정 네트워크 주소와 포트를 독점적으로 바인딩하기 때문입니다.
주요 원인
- 소켓이 이미 실행 중인 경우
- 동일한 IP와 포트를 사용하는 다른 소켓이 이미 실행 중일 수 있습니다.
- 이전 실행 중이던 서버 소켓이 제대로 종료되지 않은 상태일 수 있습니다.
- 포트 충돌
- 동일한 포트를 사용하는 다른 애플리케이션이 실행 중일 수 있습니다.
- 빠른 재시작 문제
- 서버를 중지하고 바로 다시 시작하면, 운영 체제가 포트를 재사용하지 못하게 막는 경우가 있습니다. 이는 TIME_WAIT 상태 때문입니다.
- 잘못된 바인딩
- 올바르지 않은 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은 로컬 머신에서만 작동합니다.
추가 디버깅 방법
- 예외가 발생하는 구체적인 코드를 확인하세요.
- 로그를 추가하여 서버 소켓이 중복으로 생성되는 경우가 있는지 확인합니다.
위의 해결 방법을 적용하면 해당 오류를 방지할 수 있을 것입니다. 😊
반응형
'C#' 카테고리의 다른 글
`TimeSpan.FromSeconds` vs `Thread.Sleep`: 차이와 올바른 사용법 (0) | 2025.01.16 |
---|---|
ProcessorAffinity로 CPU 코어 활용 제어하기 (27) | 2025.01.14 |
C# 람다식: 간결하고 강력한 익명 함수 이해하기 (0) | 2025.01.13 |
C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 (0) | 2025.01.13 |
C# internal: 어셈블리 내 접근 제한자 (0) | 2025.01.10 |
C# Struct vs Class: 차이점과 최적 사용 사례 (0) | 2025.01.06 |
재미로 만드는 로또 번호 생성기 #2_로또 API를 이용해서 당첨 번호 조회하기. (2) | 2025.01.05 |
재미로 만드는 로또 번호 생성기 #1_중복 없는 번호 생성 (0) | 2025.01.04 |