我已经编写了一个简单的 php 页面,它也向我的几台运行 Windows 7 的计算机发送 LAN 唤醒数据包。
如何检查计算机是否已开机(假设该位置的互联网可以正常工作)?
我可以在加载页面以检查响应时如何 ping 计算机吗?
附加信息:这些计算机都位于不同的位置,它们为 IP 设置了动态 dns,并且都位于与其他计算机一起的路由器后面。
我已经编写了一个简单的 php 页面,它也向我的几台运行 Windows 7 的计算机发送 LAN 唤醒数据包。
如何检查计算机是否已开机(假设该位置的互联网可以正常工作)?
我可以在加载页面以检查响应时如何 ping 计算机吗?
附加信息:这些计算机都位于不同的位置,它们为 IP 设置了动态 dns,并且都位于与其他计算机一起的路由器后面。
我可以通过 Windows RDC 远程桌面所有计算机,我为它们打开了端口 3389 以及一个单独的 WOL 端口,因此它们有两个开放端口
然后尝试打开远程桌面会话?
<?php
$timeout = 10;
$socket = @fsockopen( 'ip-of-the-client', 3389, $errno, $errstr, $timeout );
$online = ( $socket !== false );
var_dump( $online );
代码中的@
是因为 fsockopen 在无法建立连接时会抛出 PHP 警告。
编辑:为了清楚起见;3389 是用于创建远程桌面连接的默认端口。
关于这一点:
我可以通过 Windows RDC 远程桌面所有计算机,我为它们打开了端口 3389 以及一个单独的 WOL 端口,因此它们有两个开放端口。
由于 RDP 已打开,您最好的选择(除了可能被阻止的 ICMP ping)可能是打开一个到端口 3389 的 TCP 套接字,这将确认计算机在线并完全启动(即 RDP 服务正在运行) .
只需使用 fsockopen 执行此操作,如下所示:
function ServiceOnline($ip, $port = 3389) {
$rdp_sock = @fsockopen($ip, $port, null, null, 5); // 5 sec timeout so that it doesn't hang for a whole minute if not available
if (!$rdp_sock) {
return false;
} else {
fclose($rdp_sock);
return true;
}
}
如果另一个服务可用作备用服务,您也可以使用此代码,例如,通过传入$port
参数。