Python帮助 - 这不是循环? (插座)

时间:2013-12-11 22:27:46

标签: python sockets

我的代码出现问题,当我输入一个端口范围时,程序将暂停一个关闭的端口。它有开放端口时很好。有人可以帮忙吗?

#!/usr/bin/env python

import sys
import socket
import subprocess

address = raw_input("Which IP would you like to scan?  ")
r1 = input("What starting IP would you like to scan? i.e 10:  ") 
r2 = input("Which ending IP would you like to scan? i.e 300: ")     

print "This can take a while for big port ranges. Scan commencing on", address 

for port in range(r1,r2):    

            sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)        

if(sock.connect_ex((address,port))==0):    
        print "Port " , port, "is open"         
        sock.close()                            
        print " "                                
        print "Scan completed sucessfully"
else: 
    print " "
    print "Scan completed, No ports found!"

1 个答案:

答案 0 :(得分:1)

问题是(在大多数防火墙下),远程计算机故意不会响应进入关闭端口的TCP连接数据包 - 如果这样做,你的connect_ex()调用将很快失败(使用errno = ECONNREFUSED )。这将允许您快速继续尝试下一个端口,这不是防火墙设计者想要鼓励的。

因此,他们只是忽略传入的TCP数据包,并且您的计算机无法确定远程计算机是故意忽略您,还是只是响应缓慢。

所以你真正做的就是为自己选择一个“合理的”超时,并假设在超时期限内没有成功连接的任何TCP连接都必须指明一个防火墙端口。

至于如何在Python中这样做,它非常简单;有关详细信息,请参阅here