【问题标题】:How to get my client to ping server?如何让我的客户端 ping 服务器?
【发布时间】:2010-06-23 04:11:42
【问题描述】:

我正在尝试找出一种方法,让我的客户可以通过 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

【问题讨论】:

    标签: php ping icmp


    【解决方案1】:

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

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

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

    如果您确实必须从客户端发送 ping,那么您需要使用 java applet / flash / activeX 来执行此操作(假设这些具有执行 ping 所需的低级 TCP 堆栈访问)。

    C.

    【讨论】:

    • symcbean 说了什么。更不用说许多 ISP 路由器以最低优先级或接近最低优先级优先考虑 ICMP 流量。禁止ping-then-do!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      您必须在 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 操作,但它可以用来让服务器现在这是最后一个ping 请求。请注意,此代码信任客户端,这意味着您可能需要在服务器端的安全性方面做一些额外的工作(也许从服务器端去掉“操作”的整个概念并只发送 ping?)。此外,您可能希望每个页面都有不同的计数器,可能由您在第一个请求中返回的某个令牌标识。

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

      【讨论】:

      • -1 表示“在 JS 中构建“ping”函数”,然后详细描述如何通过 TCP 测量 HTTP 请求。
      • symcbean,这是我所知道的最好的解决方案。我明确指出 HTTP 和 CPU 延迟也将包括在内,但如果您知道一种发送 ICMP 请求或以其他方式测量网络延迟的方法,那么我会很高兴被证明是错误的。
      • +1 指出您也在测量监控软件的执行时间 :)
      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2021-11-07
      • 2021-03-19
      • 2016-04-06
      相关资源
      最近更新 更多