2009-11-18 7 views
2

주어진 TCP/IP 포트가 사용되는지 (바운드 및/또는 연결되었는지) 확인하는 데 사용할 수있는 API 기능이 Linux (커널 2.6.20)에 있습니까?포트가 사용 가능한지 확인하는 방법

bind() 유일한 해결책은 (SO_REUSEADDR 옵션이있는 소켓을 사용하여 지정된 포트에 바인딩 한 다음 닫는 것)?

답변

2

/proc/net/tcp 

/proc/net/tcp6 

사용 된 포트를 찾고하여 수행되어 해당 파일의 항목.

네 번째 필드를 보면 연결 상태를 알 수 있습니다. 예를 들어, 0A는 LISTEN이고 01은 ESTABLISHED입니다.

+0

특히 strace를 사용하는 것이 좋습니다. 해당 파일을 사용하는 것 외에 직접 API 호출이 있습니까? – CsTamas

+0

아쉽게도 불행히도 보이지 않습니다. 버클리 소켓 API는 매우 간결하며 실제로는 그렇지 않습니다. 일부 API (Microsoft와 같은)는 버클리 소켓에서만 사용할 수있는 비표준 확장 기능을 가지고 있습니다.하지만 리눅스는 그렇게 생각하지 않습니다. – Benj

0

netstat 명령의 소스를 잡고 어떻게 표시되는지 확인하십시오. 그러나 항상 경주가 있습니다. 또한 SO_REUSEADDR은 다른 사람이 실제로 사용하는 포트를 사용하지 못하게합니다. 물론 하나만 기다리십시오. 의 두 번째 필드에서 헥사 strace -o trace.out netstat -at

NETSTAT 따르면

1

거룩한 휴대용 BSD 소켓 API를 사용하면 할당하기 전에 포트가 사용 중인지 여부를 알 수 없습니다. API를 능가하려고 시도하지 마십시오. 나는 그것이 유혹을 느낀다. 나는 전에 그 상황에 빠져 있었다. 그러나 이것을 (예를 들어 proc 파일 시스템으로) 현명하게 수행하는 방법은 미묘한 오류, 미래의 호환성 문제, 경쟁 조건 등이 발생하기 쉽습니다.

관련 문제