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

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

상위 프로세스를 완료 socket/bind/accept하고 하위 프로세스를 분기하고 상위 프로세스가 계속 연결을 수락하는 동안 통신할 수 있도록 해당 소켓을 여는 상위 프로세스를 고려하십시오. 그런 다음 상위 프로세스가 종료됩니다.

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

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

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

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

답변1

모든 의미를 이해하지는 못하지만(잘못된 위치를 찾고 있거나 문서가 부족함) 특정 시간 SO_LINGER동안 동일한 세부 정보를 사용하여 새 소켓을 열 수 있는 프로세스는 없다고 생각합니다. ) 설정 되지 않은 경우 연결 단어를 닫은 후 SO_REUSEADDR.

내가 이해한 바에 따르면 이는 연결이 닫힌 후 누군가가 다시 연결하는 것을 방지하기 위한 것이며 프로세스는 이전 프로세스를 위해 의도된 패킷을 처리해야 합니다.

man 7 socket이는 문서화되어 있지 않으므로 SO_REUSEADDR답변을 파악하기가 어렵습니다.

관련 정보