Python 2.7端口扫描器显示所有端口关闭的问题求助
你的端口扫描器全显示关闭?这几个问题得先解决!
嘿,我仔细看了你的代码和问题描述,发现几个关键问题导致所有端口都被误判为关闭,咱们一步步来修正:
1. 复用同一个Socket是大坑!
你在函数外面只创建了一个s Socket对象,一旦第一次连接某个关闭的端口失败,这个Socket就会进入错误状态,之后再用它连任何端口都会直接抛出异常——相当于“一次失败,全锅端”。
正确姿势:每次扫描端口时都新建一个Socket实例,让每个端口的连接尝试都是独立的,互不干扰。
2. 没设置超时,要么卡要么错
默认的Socket连接超时时间特别长,要是目标服务器没响应,程序会僵住好久,甚至被系统强制中断。加个超时设置,既能提高扫描效率,也能避免无意义的等待。
3. 异常处理太潦草
你的代码里except:后面没写完,最好明确捕获socket.error这类网络相关的异常,别把其他无关异常也当成端口关闭来处理,不然容易误判。
修复后的完整代码
import socket def pscan(port): serverIp = socket.gethostbyname('www.google.com') # 每次扫描都新建socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置1秒超时,避免卡壳 s.settimeout(1) try: s.connect((serverIp, port)) print(f"Port {port} is open") return True except socket.error: print(f"Port {port} is closed") return False finally: # 不管成功失败,都记得关闭socket释放资源 s.close() # 先测谷歌肯定开放的80和443端口,验证代码是否正常 for port in [80, 443, 21, 22]: pscan(port)
额外提醒
- 谷歌对外只开放80(HTTP)和443(HTTPS)这类服务端口,其他大部分端口本来就是关闭的,你可以先扫这两个端口确认代码没问题。
- 别对着公共服务器大规模扫端口,容易被防火墙拦截,甚至触发安全机制,遵守网络规范很重要哦。
- 对了,Python2.7早就停止维护了,建议尽早转Python3,语法差异不大,但安全性和兼容性好太多啦。
内容的提问来源于stack exchange,提问作者user9570858
相关产品推荐
相关产品推荐

