
내 C 프로그램이 소켓을 사용하고, 에 바인드하고 localhost:9025
, 일부 데이터를 교환하고, 수동으로 종료되었다가 다시 시작되면 다음 오류와 함께 충돌이 발생하는 경우가 있습니다.
이미 사용 중인 주소입니다.
"port를 사용하는 pid"를 찾으려고 시도한 모든 SE 권장 소프트웨어는 프로세스 ID를 반환하지 못했기 때문에 그 당시에 port를 사용하는 프로세스가 없다고 가정합니다 9025
.
그럼에도 불구하고 주제적으로 유사한 질문에 대한 의견에서 수집한 내용에 따르면 프로세스가 해당 특정 주소를 사용하는 경우에만 "주소"가 "이미 사용 중"인 것처럼 보였습니다. 그러면 이것이 왜 거짓입니까?
이제 OS가 어떤 주소가 사용 중이고 어떤 주소가 사용되지 않는지 추적한다고 가정합니다. 그런데 그게 사실인가요? 만약 그렇다면 어떻게 수정해야 하는지 알려주시면 감사하겠습니다. 왜냐하면 이 문제에 대한 최선의 해결책은 "미정의 시간 동안 기다리는 것"이기 때문입니다.
편집: 저는 Linux 5.2.2-arch1-1-ARCH x86_64를 사용합니다.
답변1
프로그램을 너무 빨리 다시 시작하거나 프로그램이 소켓을 닫지 않는 것 같습니다.
소켓이 닫힌 후에도 Linux는 한동안 연결을 림보 상태로 유지하지만 "소스 주소, 소스 포트, 대상 주소, 대상 포트"의 동일한 4중 항목에 대해 다른 연결이 허용되지 않도록 합니다.
해결책은 다음을 사용하여 프로그램에서 소켓 옵션을 설정하는 것입니다. 세트 옵트 이와 같이:
setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )