청취 소켓이 바인드되지 않았지만 연결이 열려 있을 때 EADDRINUSE를 얻는 의미는 무엇입니까?

청취 소켓이 바인드되지 않았지만 연결이 열려 있을 때 EADDRINUSE를 얻는 의미는 무엇입니까?

를 완료하고 해당 소켓이 열려 있는 하위 항목을 포크하여 통신할 수 있도록 하는 상위 프로세스를 고려하고 socket/bind/accept, 상위는 계속 연결을 허용합니다. 그런 다음 해당 상위 프로세스가 종료됩니다.

이제 다른 프로세스가 동일한 포트에서 상위 프로세스가 바인딩된 동일한 주소에 바인딩을 시도하지만 EADDRINUSE 오류가 발생합니다.

그러나 를 사용하여 이 프로세스를 완료 sshd하면sshd ~이다닫힌 포트에 다시 바인딩할 수 있지만 다시 시작 창(sshd 상위 프로세스가 실행되지 않는 경우) 동안 다른 프로그램(다른 사용자로 실행 중)은 EADDRINUSE를 얻습니다.

이것의 의미는 무엇입니까? sshd리바인드할 수 있는데 다른 사용자 프로세스는 왜 할 수 없나요?

netstat -a | grep PORT또한 하위 프로세스만 실행 중인 동안(다른 프로세스는 실행할 수 없는 경우 bind) 출력이 유일한 연결이 ESTABLISHED하나이고 상태가 없음을 확인할 수 있습니다 LISTEN.

답변1

모든 의미를 이해하지는 못하지만(잘못된 위치를 찾고 있거나 문서가 부족함) 연결을 닫은 후(아마도 에 의해 설정됨 SO_LINGER) 일정 시간 동안은 어떤 프로세스도 설정하지 않은 한 동일한 세부 정보로 새 소켓을 엽니다 SO_REUSEADDR.

이는 연결이 닫힌 후 누군가 다시 연결하는 것을 방지하고 프로세스가 이전 프로세스를 위한 패킷을 처리해야 하는 것을 방지하기 위한 것입니다.

man 7 socketSO_REUSEADDR이 답변을 파악하기 어렵게 만든 일부로 이것을 문서화하지 않습니다 .

관련 정보