Windows에서 어떤 프로세스가 수신 대기 없이 포트에 바인딩되었는지 확인

Windows에서 어떤 프로세스가 수신 대기 없이 포트에 바인딩되었는지 확인

어떤 과정인지 알고 싶다면청취어떤 소켓에서 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

검색하려는 정보에 따라

편집하다:

dwStateTCP_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;

관련 정보