어떤 과정인지 알고 싶다면청취어떤 소켓에서 netstat/TCPview를 사용할 수 있고 즉시 볼 수 있습니다. 그러나 청취하지 않고 주소에 바인딩하는 것이 가능합니다. 이 작업이 완료되면 netstat/TCPview에 표시되지 않지만 소켓은 차단됩니다.
파이썬 예:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
이제 포트가 바인딩되었으며 첫 번째 인스턴스가 실행 중인 동안 두 번째 인스턴스에서 동일한 코드를 실행하려고 하면 오류가 발생합니다. 그러나 실제로 다음을 사용하여 해당 포트에서 수신 대기를 시작하지 않는 한
s.listen(1)
포트가 netstat/TCPview에 표시되지 않습니다.
질문은 ~이야: 어떤 포트인지 확인할 수 있나요?경계(그러나 듣지 않음), 어떤 프로세스가 그들을 구속하고 있습니까?
제가 이런 일을 겪게 된 배경 은바인딩할 수 없는 1976개 포트의 이동 범위, 그리고 이 문제의 원인이 무엇인지 알고 싶습니다. 그동안 시행착오를 거쳐 인터넷 연결 공유가 해당 포트를 차단하고 있다는 사실을 확인했지만, 여전히 이 질문에 대한 답이 궁금합니다.
편집하다:많은 요청으로 인해 해당 포트를 찾는 데 사용한 코드는 다음과 같습니다.
import time
import socket
for i in range(0,65536):
try:
print "Listening on port", i, '...',
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', i))
serversocket.listen(5)
#time.sleep(0.1)
serversocket.close()
print "ok"
except:
print "FAIL"
(출력을 grep으로 파이프하고 FAIL에 대해서만 필터링할 수 있습니다)
답변1
오늘은 꼭 이 일을 해야 했어요. Powershell은 Get-NetTCPConnection
.
PS C:\WINDOWS\system32> Get-NetTCPConnection -LocalPort 53100
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
0.0.0.0 53100 0.0.0.0 0 Bound 40120
PS C:\WINDOWS\system32> get-process -PID 40120
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
2133 1331 13884 30740 30,955.31 40120 1 HWMonitorPro
답변2
최신 버전의 netstat에는 해당 소켓을 표시하는 명령줄 매개변수 -q가 있습니다.
$ netstat -?
Displays protocol statistics and current TCP/IP network connections.
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
-a Displays all connections and listening ports.
-b Displays the executable involved in creating...
...
-p proto Shows connections for the protocol specified...
-q Displays all connections, listening ports, and bound
nonlistening TCP ports. Bound nonlistening ports may or may not
be associated with an active connection.
-r Displays the routing table.
...
사용 예:
$ netstat -nq -p tcp
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:7 0.0.0.0:0 LISTENING
TCP 0.0.0.0:9 0.0.0.0:0 LISTENING
TCP 0.0.0.0:13 0.0.0.0:0 LISTENING
...
TCP 192.168.122.157:50059 54.213.66.195:443 ESTABLISHED
TCP 0.0.0.0:49676 0.0.0.0:0 BOUND
TCP 0.0.0.0:49700 0.0.0.0:0 BOUND
TCP 0.0.0.0:49704 0.0.0.0:0 BOUND
TCP 0.0.0.0:49705 0.0.0.0:0 BOUND
...
해당 상황에서 소켓을 가져오기 위한 공개 API가 없는 것 같습니다. 내 것을 보아라StackOverflow의 질문.
답변3
당신은 사용해야합니다
DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserved );
~와 함께
TableClass 값 = TCP_TABLE_OWNER_PID_ALL "또는" TCP_TABLE_OWNER_PID_CONNECTIONS "또는" TCP_TABLE_OWNER_PID_LISTENER
pTcpTable 구조 -> MIB_TCPTABLE_OWNER_PID
검색하려는 정보에 따라
편집하다:
dwState
TCP_TABLE_OWNER_PID_ALL은 바인드되고 청취하지 않을 때 각각 있어야 하는 MIB_TCPROW_OWNER_PID 구조의 배열인 MIB_TCPTABLE_OWNER_PID 구조를 반환합니다. MIB_TCP_STATE_CLOSED
이 구조는 또한 다음을 제공합니다 dwLocalAddr
.dwLocalPort
typedef struct _MIB_TCPROW_OWNER_PID {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;