确定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个端口不能绑定移动范围,我想知道是什么原因造成这一点。同时,通过反复试验,我确定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进行过滤)


您可以将此脚本从0循环到65535,记录失败的端口,并将结果与​​netstat端口进行比较。netstat中未列出的那些应该是您想要的。我不知道有任何工具或技术可以向您显示这些端口背后的进程,除非正在侦听。
Kedar 2013年

@Kedar:这正是我找出受影响的端口的方法。
2013年

@Lizz:代码发布。
2013年

您可以将其发布为答案吗?可以作为参考:)
Lizz

@Lizz:这不是问题的答案。它显示受影响的端口,但不显示正在占用的端口。
2013年

Answers:


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_CLOSED的约束,不听时,这种结构也提供dwLocalAddrdwLocalPort

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)
Luke Dunstan

涉及的结构具有特定的对齐方式,您不应重新定义它们;您应该参考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中查看我的问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.