상위 프로세스를 완료 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
답변을 파악하기가 어렵습니다.