포트를 보유하고 있는 연결되지 않은 소켓이 있는지 감지합니다(Linux의 경우).

포트를 보유하고 있는 연결되지 않은 소켓이 있는지 감지합니다(Linux의 경우).

Linux(구체적으로: Ubuntu 20.04 LTS, 커널 5.4.0)에서 테스트됨: Python에서:

from socket import *
s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
s1.bind(('', 11001))
s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
s2.bind(('', 11001)) ## Here it fails: EADDRINUSE

따라서 s1이 바인딩되면 포트 사용이 이미 시스템 어딘가에 등록되어 있습니다.

listen()그러나 내가 전화 하거나 소켓에 있지 않으면 connect()찾을 수 있는 레지스트리에는 표시되지 않습니다 . 목록 에도 /proc/net/tcp없습니다 . 포트 없이 나열하십시오.netstatsslsof

python3   28296                           netch    5u     sock                0,9       0t0    4311999 protocol: TCP
python3   28296                           netch    6u     sock                0,9       0t0    4312006 protocol: TCP

소켓에서 Listen()을 호출할 때만 보이는 목록에 나타납니다.

$ ss -at | grep 11001
LISTEN 0      128            0.0.0.0:11001                0.0.0.0:*             

여기서 TCP는 단일 사례가 아닙니다(처음에는 SCTP와 동일한 방식으로 직면했습니다).

비교를 위해 FreeBSD(12.3에서 테스트됨)는 소켓을 즉시 나열합니다( Inspection 사용 sockstat).

$ sockstat -P tcp -p 11001           
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
netch    python3.8  797   4  tcp4   *:11001               *:*

그러한 소켓의 존재를 나열할 수 있는 도구가 있습니까? 모든 프로세스를 반복하지 않고도 수행할 수 있습니까? netstat, ss와 같은 표준 도구가 이 문제를 무시하는 이유는 무엇입니까?

답변1

자기 자신에 대한 대답: 가능한 작업 비밀이 있습니다여기, 비록 매우 번거롭기는 하지만. 댓글에서 지적해 주신 @AB에게 감사드립니다.

더 나은 해결책을 찾으면 업데이트하겠습니다.

관련 정보