-
오류 상황 이런 상황이 생기면 사용중인 프로세스 ID 를 검색하여 다음과 같이 프로세스만 죽이면 임시적으로는 해결이된다
임시 해결책 하지만 개발 도중 매번 이 과정을 반복하지 않으려면 코드 종료시 알아서 자원을 정리해주면 더 좋을 것이다.
해결 방법을 알아보자
1. Address already in use 오류란?
이 오류는 네트워크 프로그래밍에서 자주 발생하는 문제로, 이미 사용 중인 포트에 바인딩을 시도할 때 발생한다.
주로 다음과 같은 상황에서 마주치게 된다
- 이전 프로그램이 비정상 종료되어 포트가 TIME_WAIT 상태인 경우
- 다른 프로세스가 해당 포트를 사용 중인 경우
- 서버 프로그램을 재시작할 때 이전 연결이 완전히 종료되지 않은 경우
2. 실제 발생 사례
다음은 TCP 소켓 서버에서 흔히 발생할 수 있는 상황이다
class Connection: def connect(self): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 소켓 옵션 설정 없이 바로 바인딩 시도 self.server_socket.bind((self.host, self.port)) # OSError: [Errno 98] Address already in use self.server_socket.listen(backlog)
이 코드의 문제점:
- 소켓 옵션 설정이 없어 포트 재사용이 불가능
- 이전 연결의 TIME_WAIT 상태를 처리하지 못함
- 프로그램 종료 시 소켓 정리가 제대로 되지 않음
3. 오류의 기술적 설명
TIME_WAIT 상태
- TCP 연결이 종료될 때, 마지막 ACK가 유실될 경우를 대비해 일정 시간 동안 소켓을 TIME_WAIT 상태로 유지
- 이 기간 동안은 같은 주소와 포트를 재사용할 수 없음
- 기본적으로 Linux에서는 이 시간이 60초 정도
errno 98
- POSIX 시스템에서 "Address already in use" 오류는 errno 98로 표시
- 바인딩하려는 주소가 이미 다른 프로세스에 의해 사용 중이거나 TIME_WAIT 상태임을 의미
4. 해결 방법
class Connection: def __init__(self, host, port, thread_count): self.host = host self.port = port self.thread_count = thread_count self.server_socket = None def connect(self): try: self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 포트 재사용 설정 self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Linux 시스템에서 추가 설정 if hasattr(socket, 'SO_REUSEPORT'): self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) self.server_socket.bind((self.host, self.port)) self.server_socket.listen(backlog) except Exception as e: logger.error(f"Server error: {e}") raise finally: self.cleanup() def cleanup(self): if self.server_socket: try: self.server_socket.shutdown(socket.SHUT_RDWR) except Exception: pass finally: self.server_socket.close() self.server_socket = None
수정사항:
- SO_REUSEADDR 옵션 설정으로 포트 즉시 재사용 가능
- SO_REUSEPORT 옵션으로 Linux 시스템에서의 포트 공유 지원
- 명시적인 cleanup 메소드로 리소스 정리
- 예외 처리를 통한 안전한 소켓 종료
5. 소켓 옵션 설명
SO_REUSEADDR
- TIME_WAIT 상태의 주소 재사용을 허용
- 서버 재시작 시 "Address already in use" 오류 방지
- 대부분의 상황에서 안전하게 사용 가능
SO_REUSEPORT (Linux)
- 여러 소켓이 같은 포트를 공유할 수 있게 함
- 로드 밸런싱 구현에 유용
- Linux 커널 3.9 이상에서 지원
이미지 생성은 맘에든적이 없다 'python > 오류 해결' 카테고리의 다른 글
[Python] "The truth value of an array with more than one element is ambiguous" 오류 (NumPy) (0) 2025.04.02 [Python] OSError: [Errno 9] Bad file descriptor 오류 (0) 2025.04.02