Определение того, какой процесс привязал порт (без прослушивания) в Windows

Определение того, какой процесс привязал порт (без прослушивания) в Windows

Если я хочу узнать, какой процессслушаюна каком сокете, я могу использовать netstat/TCPview и сразу его увижу. Однако можно привязаться к адресу без прослушивания. Если это сделать, он не отображается в netstat/TCPview, но блокирует сокет.

Пример на Python:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))

Порт теперь привязан, и попытка выполнить тот же код во втором экземпляре, пока первый все еще работает, приведет к ошибке. Однако, если вы на самом деле не начнете прослушивать этот порт, используя

s.listen(1)

порт не отображается в netstat/TCPview.

Вопрос в том: Можно ли посмотреть какие порты естьграница(но не слушают), и какой процесс их связывает?

Предыстория этого такова, что у меня былподвижный диапазон 1976 портов, которые не могут быть ограничены, и я хочу знать, что является причиной этого. В то же время, я определил методом проб и ошибок, что Internet Connection Sharing блокирует эти порты, но мне все еще интересно узнать ответ на этот вопрос.

Редактировать:По многочисленным просьбам, вот код, который я использовал для поиска этих портов:

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

в зависимости от информации, которую вы хотели бы получить

РЕДАКТИРОВАТЬ:

TCP_TABLE_OWNER_PID_ALL возвращает структуру MIB_TCPTABLE_OWNER_PID, которая представляет собой массив структур MIB_TCPROW_OWNER_PID, где каждая dwStateдолжна иметь значение 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;

Связанный контент