Визначення того, який процес зв'язав порт (без прослуховування) в 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 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;

Це лише переліки сокетів, які є прив’язаними та прослуховуючими, але питання стосувалося конкретно сокетів, які пов'язані, але не слухають.
Люк Данстан

ти стверджуєш чи питаєш ??? дивіться правку
Пат

Коли я запускаю 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.