如何让我的客户端ping服务器?

时间:2010-06-23 04:11:43

标签: php ping icmp

我正试图找到一种方法,我的客户可以通过php ping我的服务器,然后将结果检索为“15 MS”这样的格式。

我最终找到了服务器可以ping服务器的方法。但是,我希望能够让远程用户以某种方式ping服务器,或者让服务器可能ping客户端?

function track($host, $port, $timeout) {
$firstTime = microtime(true);
$sock = fSockOpen($host, $port, $errno, $errstr, $timeout);
if (!$sock) {
echo "<b>Offline</b>";
}
$secondTime = microtime(true);
$ping = round((($secondTime - $firstTime) * 1000), 0);
echo $ping." ms";
}

track($_SERVER["REMOTE_ADDR"], 80, 10);

我尝试了这个功能,我让服务器ping客户端,看看客户端/服务器之间的响应时间。

fsockopen()[function.fsockopen]:无法连接到XXXXXXXXXXX:80

3 个答案:

答案 0 :(得分:1)

  

我正试图想办法让我的客户可以通过php ping我的服务器

为什么呢?了解这些信息有什么价值?虽然我注意到Emil的答案没有解决这个问题,但它可能解决了这个问题 - ICMP数据包进入服务器并返回的时间与在端口80上完成TCP握手所需的时间不同通过互联网(如果网络服务器没有饱和,它们应该在局域网上大致相同)。

如果您想获得有关RTT时间的良好信息,那么更好的解决方案是使用网络监控工具/软件。 PastMon是一个明显的候选人。

如果你真的必须从客户端发送ping,那么你需要使用java applet / flash / activeX(假设它们具有执行ping所需的低级TCP栈访问)。

下进行。

答案 1 :(得分:0)

是什么让您认为客户可以可靠地响应ICMP回应请求?

更好的解决方案是编写客户端Java小程序(或JavaScript?)来ping您的服务器。

请记住,安全限制将限制两种语言仅与通信服务器进行通信。除了您自己的用户之外,您将无法允许用户ping服务器......但在您的情况下,这似乎不是问题。

答案 2 :(得分:0)

您必须在JavaScript中执行此操作。客户端根本无法运行PHP,并且当他们的防火墙阻止来自外部的请求时(通常是这种情况),您尝试ping客户端将无法工作。

在JS中构建一个“ping”函数,它通过AJAX几次获取页面。这个例子建立在jQuery框架之上:

网页/ JS

<script src="jquery-1.4.2.min.js"></script>
<script>
var global_runs = 0;
function ping(data) {
        var op = "";
        if(global_runs == 0) {
                op = "start";
        }else if(global_runs == 3){
                op = "end";
        }else if(global_runs > 3) {
                return;
        }
        global_runs++;
        $.post("ping.php", {op: op}, ping);
        if(data != null) {
                $("#time").text(data + " MS");
        }
}

$(document).ready(function(){
        //Start pinging
        ping();
});
</script>

<p id="time">Time will be here</p>

<强> ping.php

<?php
session_start();
if($_POST['op'] == 'start' || !isset($_SESSION['start'])) {
        $_SESSION['start'] = microtime(true);
        $_SESSION['runs'] = 0;
}else{
        $_SESSION['runs']++;
        $now = microtime(true);
        $time = $now - $_SESSION['start'];

        echo ($time / $_SESSION['runs']) * 1000; //milliseconds
}
?>

我在这里并没有真正使用end op,但它可以用来让服务器现在知道这是最后一个ping请求。请注意,此代码信任客户端,这意味着您可能需要对服务器端的安全性进行一些额外的工作(可能会从服务器端删除“操作”的整个概念并发送ping命令?)。此外,您可能希望每个页面都有不同的计数器,可能由您在第一个请求中返回的某个令牌标识。

另请注意,这也取决于HTTP和CPU延迟,而不仅仅是网络,但我认为它可以获得它。