如果我想知道进程是什么聆听在哪个套接字上,我可以使用 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 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;