【问题标题】:PHP ping IP:PortPHP ping IP:端口
【发布时间】:2014-01-30 10:45:57
【问题描述】:

我想 Ping 基于 IP 和端口的服务器。为什么是港口? 因为我正在构建的系统将在不同的端口上有登录服务器和游戏服务器 现在我正在使用 fsockopen

        $start = microtime(true);
        $fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$fp) {
            return false;
        }
        else {
            $ping = microtime(true) - $start;
            $ping = round($ping * 1000);
            $res['ip'] = $host;
            $res['port'] = $port;
            $res['ping'] = $ping;
            $res['msg'] = 'success';
            return $res;
        }

我不能也不想用 exec() 1. IP 和 Port 将由用户输入,exec() 无法 ping 端口。

使用 fsockopen 我只能接受延迟(这不太正确)。

如果有人知道我怎么不能得到 Latensy、Packets send|recived、Jitter 等。

也许是某种用于 PHP Ping 的第 3 方 API。 提前谢谢你

【问题讨论】:

  • 重复?在没有 fsockopen 的情况下 ping IP+PORT 没有答案
  • 对不起,我的错。无论如何,你能详细说明你的情况吗? Ping 在 ICMP 协议上工作,在所述不同端口上的登录服务器/游戏服务器是否也使用 ICMP?如果您想实际使用“ping”,我认为他们应该这样做。
  • 是登录服务器/游戏服务器使用ICMP
  • 如果您的服务不支持 ping 对话框,您应该留在 ICMP。

标签: php ping


【解决方案1】:

您必须使用socket_create(),因为 ping 使用 ICMP,而 fsockopen 仅适用于 TCP 和 UDP。 ICMP 回显数据包不指定任何端口。在socket_create手册中,用户cmets中有几个ping()示例实现。

【讨论】:

    【解决方案2】:

    您可以在RFC 792查看ICMP数据包格式

    虽然 ICMP 是 layer3 协议,但端口号是在 layer4 中定义的。所以你永远不会在 ICMP 数据包中找到端口号

    这意味着,您可以在两个 host(IP) 之间获得延迟,但不能在 IP:ports 之间获得延迟。

    【讨论】:

      猜你喜欢
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2015-01-19
      相关资源
      最近更新 更多