返回

如何快速检查局域网中电脑是否处于休眠状态而不唤醒它?

windows

如何快速检查局域网中电脑是否处于休眠状态,而不唤醒它

问题陈述

在局域网络中,我们需要一种方法来检查计算机是否处于唤醒状态,而不会意外地唤醒它们。为了实现这个目标,我们使用了以下 Python 代码:

import subprocess

def is_awake(ipOrName, timeout=0.05):
    try:
        tt = round(timeout * 1000)
        cmdargs = ["ping", "-n", "1", "-w", f'{tt}', "-a", ipOrName]
        result = subprocess.run(cmdargs, capture_output=True, text=True)
        if "Received = 1" in result.stdout:
            return True
        else:
            return False
    except Exception as e:
        print(f"Error checking IP reachability: {e}")
        return False

但是,当我们对大量 IP 地址(例如 30 个)进行顺序检查时,该方法运行得很慢。我们发现,对于处于关闭状态的计算机,subprocess.run() 函数在前后都有明显的延迟。对于处于开启状态的计算机对应的 IP,该函数几乎立即返回。这表明超时参数没有被正确遵守,或者有其他原因导致 subprocess.run() 函数长时间返回。

解决方案

经过研究,我们找到了一个更快的解决方案:

import socket

def is_reachable(ipOrName, port=445, timeout=0.05):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(timeout)
    try:
        s.connect((ipOrName, int(port)))
        s.shutdown(socket.SHUT_RDWR)
        return True
    except:
        return False
    finally:
        s.close()

此代码使用套接字连接来检查计算机是否可以访问,而不是使用 ping 命令。它避免了 subprocess.run() 函数的延迟,从而显著加快了检查速度。

结论

使用套接字连接比使用 ping 命令可以更快速地检查局域网中计算机的唤醒状态。这种方法允许我们快速筛选大量 IP 地址,而不会意外地唤醒处于休眠状态的计算机。

常见问题解答

  • 这个解决方案适用于所有操作系统吗?

    是的,这个解决方案适用于大多数操作系统,包括 Windows、Linux 和 macOS。

  • 它会唤醒处于休眠状态的计算机吗?

    否,这个解决方案不会唤醒处于休眠状态的计算机。它只是检查计算机是否可以访问,而不会发送唤醒信号。

  • 我可以在哪些情况下使用这个解决方案?

    你可以将这个解决方案用于各种情况下,例如网络管理、设备发现和故障排除。

  • 我可以对这个解决方案进行哪些改进?

    你可以通过并行执行检查来进一步提高这个解决方案的速度。

  • 有哪些替代方法可以检查计算机是否处于唤醒状态?

    另一种方法是使用 WMI(Windows 管理规范)或 SNMP(简单网络管理协议)来查询计算机的状态。