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
없습니다 . 포트 없이 나열하십시오.netstat
ss
lsof
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에게 감사드립니다.
더 나은 해결책을 찾으면 업데이트하겠습니다.