Python端口扫描脚本运行报错ConnectionRefusedError求助
Python端口扫描脚本ConnectionRefusedError问题说明及示例
- ConnectionRefusedError: [Errno 111] Connection refused不是脚本bug,这是扫描过程中的正常现象——说明目标IP的对应端口没有开放,或者目标主机主动拒绝了连接请求。很多开发者都写过类似的端口扫描脚本,下面给你一个简化的可直接运行的版本:
import socket def port_scan(target_ip, start_port, end_port): # 遍历指定端口范围 for port in range(start_port, end_port + 1): try: # 创建TCP套接字 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(1) # 设置1秒超时,避免无响应时卡住 # 用connect_ex替代connect,返回错误码而非直接抛异常,更适合扫描场景 conn_result = s.connect_ex((target_ip, port)) if conn_result == 0: print(f"端口 {port} 已开放") s.close() except Exception as e: print(f"扫描端口 {port} 时发生异常: {str(e)}") if __name__ == "__main__": target_ip = input("输入目标IP地址: ") start_port = int(input("输入起始端口: ")) end_port = int(input("输入结束端口: ")) port_scan(target_ip, start_port, end_port)
为什么用
connect_ex而不是connect?因为connect在端口未开放时会直接抛出异常,需要额外捕获;而connect_ex会返回错误码,0表示连接成功,其他值对应不同错误,这样能更清晰区分“端口未开放”和“其他异常”,减少不必要的异常信息输出。你原来的脚本用
connect遇到的错误,本质就是端口没开放,属于扫描的正常结果,不是脚本故障。如果想避免这类异常信息刷屏,就改用connect_ex来处理。
内容的提问来源于stack exchange,提问作者M1LL
相关产品推荐
相关产品推荐

