如果我想知道流程是什麼傾聽在什麼套接字上,我可以使用 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_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;