確定 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 連接共享阻止了這些端口,但我仍然對這個問題的答案感到好奇。

編輯:由於普遍的要求,這裡是我用來查找這些連接埠的程式碼:

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 保留);

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_CLOSEDdwLocalAddrdwLocalPort

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;

相關內容