如何快速检查局域网中电脑是否处于休眠状态而不唤醒它?
2024-03-19 03:05:58
如何快速检查局域网中电脑是否处于休眠状态,而不唤醒它
问题陈述
在局域网络中,我们需要一种方法来检查计算机是否处于唤醒状态,而不会意外地唤醒它们。为了实现这个目标,我们使用了以下 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(简单网络管理协议)来查询计算机的状态。