Python端口扫描脚本出现socket.error[Errno99]错误求助
解决你的Python端口扫描脚本报错问题
看起来你的脚本存在几个关键问题导致了报错,我来一步步帮你梳理并修复:
错误原因分析
- 无效的端口0:你用了
range(1024),这会遍历0到1023的端口,但端口0是系统保留端口,无法用于连接,这是你看到Connection failure on port 0的直接原因,后续重复尝试连接这个无效端口还触发了Errno 99错误。 - 错误调用socket.connect()并判断返回值:
socket.connect()是无返回值的方法——成功连接不会返回内容,失败则直接抛出异常。你在try-except块之后又两次调用s.connect((HOST, PORT)),不仅重复尝试连接浪费资源,而且如果之前连接失败,socket已经处于错误状态,再次调用必然报错。 - 文件写入模式错误:你用
"w"模式写入文件,这会每次覆盖之前的内容,最终日志里只会保留最后一个成功连接的端口记录,应该用"a"(追加模式)来保存所有成功连接的记录。 - 未处理HOST参数为空的情况:如果用户运行脚本时没有通过
-H指定目标主机,args.HOST会是None,这也会导致连接报错。 - socket资源未释放:每次连接后没有关闭socket,可能导致系统资源泄漏。
修复后的脚本
#!/usr/bin/python import socket import argparse import os.path def parse_args(): parser = argparse.ArgumentParser(description='Scan for open ports on given hostname or ip address') parser.add_argument('-H','--HOST', required=True, help="Enter a hostname or Ip Address") return parser.parse_args() def find_port(PORT, HOST): log_file = "Data Log.txt" # 构造日志内容,换行符保证每条记录单独一行 success_msg = 'Successful Connections were made at host {} on port {}\n'.format(HOST, PORT) s = socket.socket() socket.setdefaulttimeout(1) try: s.connect((HOST, PORT)) print '[+] Successful connection on ', PORT # 用追加模式写入日志,避免覆盖已有内容 with open(log_file, "a") as f: f.write(success_msg) except socket.error as e: print '[+] Connection failure on port {}, error: {}'.format(PORT, e) finally: # 无论连接成功或失败,都关闭socket释放资源 s.close() if __name__=='__main__': args = parse_args() # 从端口1开始扫描到1023,跳过无效的端口0 for i in range(1, 1024): find_port(i, args.HOST)
修复说明
- 调整扫描范围为
range(1, 1024),跳过无效的端口0; - 将
connect()调用仅放在try块内,成功连接后直接用追加模式写入日志,避免覆盖历史记录; - 给
--HOST参数添加required=True,强制用户必须指定目标主机,避免None值引发的错误; - 在
finally块中关闭socket,确保系统资源被正确释放; - 优化了错误信息,显示具体错误内容,方便后续调试。
内容的提问来源于stack exchange,提问作者user9688514
相关产品推荐
相关产品推荐

