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

12

Если я хочу выяснить, какой процесс прослушивает какой сокет, я могу использовать 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 года, которые не могут быть связаны , и я хочу знать, что вызывает это. Тем временем я методом проб и ошибок определил, что общий доступ к подключению к Интернету блокирует эти порты, но мне все еще интересно узнать ответ на этот вопрос.

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

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)

Ян Шейбал
источник
Вы можете зациклить этот скрипт от 0 до 65535, зарегистрировать порты, на которых он не работает, и сравнить результат с портами netstat. Те, что не указаны в netstat, должны быть именно тем, что вы ищете. Я не знаю ни одного инструмента или метода, который покажет вам, какой процесс стоит за этими портами, если только он не прослушивает.
Кедар
@Kedar: Это именно то, что я сделал, чтобы узнать, какие порты затронуты.
Ян Шейбал
@Lizz: Код опубликован.
Ян Шейбал
не могли бы вы опубликовать это как ответ? было бы хорошо иметь в качестве ссылки :)
Lizz
@Lizz: Это не ответ на вопрос. Он показывает, какие порты затронуты, но не то, что их занимает.
Ян Шейбал

Ответы:

1

ты должен использовать

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG зарезервировано);

с

Значение 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;
похлопывание
источник
В нем перечислены только сокеты, которые связаны и прослушиваются, но вопрос был конкретно о сокетах, которые связаны, но не прослушивают.
Люк Данстан
ты утверждаешь или спрашиваешь ??? см. редактирование
Пэт
Когда я запускаю pastebin.com/vaHMVRQR, я ничего не получаю в таблице для привязки без прослушивания (Win7)
Люк Данстан,
У вовлеченных структур есть определенные выравнивания, вы не должны переопределять их; Вы должны ссылаться на те, которые определены MS. Также, если вы хотите сначала протестировать MS API, Python не является подходящим инструментом; Вы должны использовать C / C ++ вместо этого.
Пэт
отображаемый код не дает информацию о сокетах, которые связаны, но не связаны; в последних версиях netstat теперь есть параметр командной строки -q, который показывает эти сокеты
zentrunix
0

В последних версиях 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 .

zentrunix
источник