소켓_바인드()를 피하고 포트에 즉시 연결하는 방법: 주소를 바인딩할 수 없습니까?

소켓_바인드()를 피하고 포트에 즉시 연결하는 방법: 주소를 바인딩할 수 없습니까?

TCP/IP 포트에서 읽어야 하는 코드를 실행할 때 종종 다음 메시지가 표시됩니다(사용된 언어에 따라 다름).

socket_bind(): unable to bind address

다른 프로세스가 이 포트를 수신/바인딩할 때 이런 일이 발생한다는 것을 알고 있으므로(정확한 설명 문구는 모르겠습니다) 내 코드가 해당 포트를 수신할 수 없습니다. 그러나 그것은내 코드방금 (CTRL-C를 통해) 이 포트를 차단하는 것을 중지했습니다! 약간의 시간 제한이 있는 것 같습니다. 잠시(약 30초) 기다린 후 코드를 시작하여 문제 없이 이 특정 포트를 수신할 수 있습니다.

나는 알고 싶다:

  • 코드를 중지한 후에도 포트가 계속 차단되는 이유는 무엇입니까?
  • 코드를 다시 시작하고 이 포트에서 수신 대기를 시작할 수 있도록 시스템에서 이 포트를 강제로 해제하려면 어떻게 해야 합니까?

답변1

C/C++에 대해 이야기하고 있다고 가정하고 setsockopt()및 을 사용하십시오 SO_REUSEADDR. 포트를 수신하는 활성 프로세스가 없으면 재사용할 수 있습니다.

편집: 여전히 작동하는 이유는 소켓을 제대로 닫지 않았기 때문입니다. Control-C가 그것을 죽입니다. netstat이를 사용하여 열려 있는 포트나 완전히 닫히지 않은 포트를 확인할 수 있습니다 .

http://www.beej.us/guide/bgnet/output/html/multipage/setsockoptman.html

https://stackoverflow.com/questions/9207781/error-in-bound-port-address-already-in-use-tcp-socket-programming-in-unix

https://stackoverflow.com/questions/10071107/rebound-a-port-to-datagram-socket-on-a-difftent-ip

관련 정보