주어진 TCP/IP 포트가 사용되는지 (바운드 및/또는 연결되었는지) 확인하는 데 사용할 수있는 API 기능이 Linux (커널 2.6.20)에 있습니까?포트가 사용 가능한지 확인하는 방법
bind()
유일한 해결책은 (SO_REUSEADDR
옵션이있는 소켓을 사용하여 지정된 포트에 바인딩 한 다음 닫는 것)?
주어진 TCP/IP 포트가 사용되는지 (바운드 및/또는 연결되었는지) 확인하는 데 사용할 수있는 API 기능이 Linux (커널 2.6.20)에 있습니까?포트가 사용 가능한지 확인하는 방법
bind()
유일한 해결책은 (SO_REUSEADDR
옵션이있는 소켓을 사용하여 지정된 포트에 바인딩 한 다음 닫는 것)?
흠
가
/proc/net/tcp
및
/proc/net/tcp6
사용 된 포트를 찾고하여 수행되어 해당 파일의 항목.
네 번째 필드를 보면 연결 상태를 알 수 있습니다. 예를 들어, 0A는 LISTEN이고 01은 ESTABLISHED입니다.
netstat
명령의 소스를 잡고 어떻게 표시되는지 확인하십시오. 그러나 항상 경주가 있습니다. 또한 SO_REUSEADDR
은 다른 사람이 실제로 사용하는 포트를 사용하지 못하게합니다. 물론 하나만 기다리십시오. 의 두 번째 필드에서 헥사 strace -o trace.out netstat -at
NETSTAT 따르면
거룩한 휴대용 BSD 소켓 API를 사용하면 할당하기 전에 포트가 사용 중인지 여부를 알 수 없습니다. API를 능가하려고 시도하지 마십시오. 나는 그것이 유혹을 느낀다. 나는 전에 그 상황에 빠져 있었다. 그러나 이것을 (예를 들어 proc 파일 시스템으로) 현명하게 수행하는 방법은 미묘한 오류, 미래의 호환성 문제, 경쟁 조건 등이 발생하기 쉽습니다.
특히 strace를 사용하는 것이 좋습니다. 해당 파일을 사용하는 것 외에 직접 API 호출이 있습니까? – CsTamas
아쉽게도 불행히도 보이지 않습니다. 버클리 소켓 API는 매우 간결하며 실제로는 그렇지 않습니다. 일부 API (Microsoft와 같은)는 버클리 소켓에서만 사용할 수있는 비표준 확장 기능을 가지고 있습니다.하지만 리눅스는 그렇게 생각하지 않습니다. – Benj