如果我想找出哪个进程正在侦听哪个套接字,我可以使用 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)