【问题标题】:Check to see if computer is on检查电脑是否开机
【发布时间】:2012-06-07 13:47:51
【问题描述】:

我编写了一个简单的 php 页面,它向我的几台运行 Windows 7 的计算机发送网络唤醒数据包。

如何检查计算机是否已开机(假设该位置的互联网可以正常工作)?

我可以知道如何在页面加载时 ping 计算机以检查响应吗?

附加信息:这些计算机都位于不同的位置,它们为 IP 设置了动态 dns,并且都位于与其他计算机的路由器后面。

【问题讨论】:

  • 他们运行的是什么操作系统?
  • 抱歉,我编辑了这个问题。他们都在运行 Windows 7
  • 网络情况如何? 你从外面联系这些电脑,他们有什么反应吗?
  • 我可以通过 Windows RDC 远程桌面所有计算机,我为它们打开了 3389 端口以及一个单独的 WOL 端口,因此它们有两个开放端口。
  • 我可以用 ping 命令 ping 路由器后面的单个计算机吗?

标签: php windows remote-access remote-management


【解决方案1】:

我可以通过 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 是用于创建远程桌面连接的默认端口。

【讨论】:

  • 这很完美。出于好奇,有没有办法设置超时,因为当计算机离线时,页面加载速度非常缓慢,但是当我只使用在线计算机进行测试时,页面非常活泼。
  • @Nick 当然,请参阅更新的示例。超时以秒为单位。请参阅文档:nl.php.net/fsockopen
【解决方案2】:

关于这个:

我可以通过 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 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多