You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python socket端口扫描报socket_family未定义错误解决方案

报错产生原因

报错核心原因是你把教程里的语法占位示例当成了可执行代码运行:

  • 第3行的socket_family、socket_type是socket.socket()构造函数的参数说明占位符,不是Python内置变量,也没有在你的代码里定义,直接调用必然触发NameError
  • 你把零散的API学习笔记片段和实际功能代码拼在了同一个脚本文件中,笔记里的无前缀调用gethostbyname("host")同样是示例代码,直接运行也会报错
  • 原代码还存在其他兼容性问题:使用了Python2专属的raw_input()、仅支持Linux的clear清屏命令、未设置socket连接超时导致扫描速度极慢,也没有实现要求的结果文件写入、异常持久化、耗时统计落盘的功能。
修复方案
  1. 删除脚本开头所有零散的API示例笔记代码,仅保留需要的导入语句
  2. 做跨平台兼容处理:替换raw_input()为Python3通用的input(),根据操作系统自动选择清屏命令
  3. 给socket连接设置合理超时(建议0.3~0.5秒),大幅提升扫描效率
  4. 新增结果文件写入逻辑:文件头部写入扫描开始时间,扫描过程中识别到的开放端口、触发的各类异常实时写入文件,扫描结束后在文件尾部写入结束时间和总耗时
  5. 调整异常捕获逻辑,触发异常时先将错误信息写入结果文件再退出,避免异常信息丢失。
符合全部功能要求的完整代码
import socket
import sys
import os
import platform
from datetime import datetime

# 跨平台清屏
if platform.system() == "Windows":
    os.system("cls")
else:
    os.system("clear")

RESULT_FILE = "port_scan_result.txt"

# 按要求提示用户输入目标主机
remote_host = input("Enter a host to scan: ")

# 初始化时间与结果变量
scan_start = datetime.now()
scan_end = None
total_cost = None
error_msg = []

try:
    # 解析主机名
    remote_ip = socket.gethostbyname(remote_host)
    print("-" * 60)
    print(f"开始扫描主机: {remote_host} ({remote_ip}),端口范围1-1025")
    print("-" * 60)

    # 写入扫描开始信息到结果文件
    with open(RESULT_FILE, "w", encoding="utf-8") as f:
        f.write(f"=== 端口扫描开始时间: {scan_start.strftime('%Y-%m-%d %H:%M:%S')} ===\n")
        f.write(f"扫描目标: {remote_host} ({remote_ip})\n")
        f.write(f"扫描端口范围: 1-1025\n\n")

    # 遍历扫描端口
    for port in range(1, 1025):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(0.5)  # 设置超时避免长时间卡顿
        connect_res = sock.connect_ex((remote_ip, port))
        if connect_res == 0:
            print(f"端口 {port}: 开放")
            # 实时写入开放端口到文件
            with open(RESULT_FILE, "a", encoding="utf-8") as f:
                f.write(f"开放端口: {port}\n")
        sock.close()

except KeyboardInterrupt:
    error_msg.append("用户手动中断扫描(Ctrl+C)")
except socket.gaierror:
    error_msg.append("主机名解析失败,请检查输入的主机地址是否正确")
except socket.error:
    error_msg.append("主机不可达或网络连接异常")
except Exception as e:
    error_msg.append(f"未知异常: {str(e)}")
finally:
    scan_end = datetime.now()
    total_cost = scan_end - scan_start
    # 写入结束信息到结果文件
    with open(RESULT_FILE, "a", encoding="utf-8") as f:
        f.write("\n")
        if error_msg:
            for err in error_msg:
                f.write(f"扫描异常: {err}\n")
        f.write(f"\n=== 端口扫描结束时间: {scan_end.strftime('%Y-%m-%d %H:%M:%S')} ===\n")
        f.write(f"扫描总耗时: {total_cost}\n")

    # 控制台输出最终结果
    print("-" * 60)
    if error_msg:
        for err in error_msg:
            print(f"扫描异常: {err}")
    print(f"扫描完成,总耗时: {total_cost}")
    print(f"扫描结果已写入文件: {os.path.abspath(RESULT_FILE)}")
代码说明
  • 运行后会严格按照要求提示Enter a host to scan,接收用户输入的主机名
  • 自动遍历1~1025所有TCP端口,设置0.5秒超时平衡扫描速度和准确率
  • 所有开放端口会实时写入结果文件,触发的主机不可达、解析失败、手动中断等异常都会写入同一个结果文件
  • 结果文件头部记录扫描开始时间、目标信息,尾部记录结束时间和总耗时,控制台也会同步打印总耗时
  • 兼容Windows、Linux、macOS多系统运行,适配Python3环境。

注意:端口扫描行为可能触发目标主机的安全告警,请仅在获得授权的前提下对目标主机进行扫描。

内容的提问来源于stack exchange,提问作者Uday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:39:39