确定哪个进程在 Windows 上绑定了端口(不监听)

Jan*_*bal 14 windows windows-7 port tcpip sockets

如果我想找出哪个进程正在侦听哪个套接字,我可以使用 netstat/TCPview 并立即看到它。但是,可以在不侦听的情况下绑定到地址。如果这样做,它不会出现在 netstat/TCPview 中,但会阻止套接字。

蟒蛇示例:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
Run Code Online (Sandbox Code Playgroud)

端口现在已绑定,并且在第一个实例仍在运行时尝试在第二个实例中执行相同的代码将导致错误。但是,除非您实际开始使用该端口侦听

s.listen(1)
Run Code Online (Sandbox Code Playgroud)

该端口未显示在 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"
Run Code Online (Sandbox Code Playgroud)

(您可能希望将输出通过管道传递给 grep 并仅过滤 FAIL)

Zan*_*ynx 6

我今天必须做这件事。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
Run Code Online (Sandbox Code Playgroud)


Pat*_*Pat 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_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;
Run Code Online (Sandbox Code Playgroud)