如何让我网站上的用户 ping 一个特定的 ip 地址?

How to make a user on my website ping a specific ip address?

我想知道像这样的网站:https://ping.eu/ping/ 是如何让我们的 ip ping 另一个 ip 并得到结果的。

有人有想法吗?

谢谢

没有。 PHP 脚本(在服务器上)很可能会用 "PHP Sockets" 来完成。看一下 这个:https://www.php.net/manual/en/sockets.examples.php

否则它可以使用 exec() 函数,但这将是一个安全漏洞。

所以回答你的问题:该网站将 ping IP 地址而不是 'client'

如果你想 ping 服务器,即像 www.google.com 这样的实际网络 address/URL,你可以看看这个 JSFiddle http://jsfiddle.net/GSSCD/203/ or GitHub repository https://github.com/jdfreder/pingjs.

这是 JSFiddle 中的一些代码:

function Pinger_ping(ip, callback) {
  if(!this.inUse) {
     this.inUse = true;
     this.callback = callback
     this.ip = ip;

     var _that = this;
     this.img = new Image();
     this.img.onload = function() {_that.good();};
     this.img.onerror = function() {_that.good();};

     this.start = new Date().getTime();
     this.img.src = "http://" + ip;
     this.timer = setTimeout(function() { _that.bad();}, 1500);
  }
}

ping server/web 地址的另一种方法是使用 Java 脚本及其支持的 XMLHttpRequest() 函数:

HTML:

<div id="result"></div>

Java脚本:

function http_ping(fqdn) {
var NB_ITERATIONS = 4; // number of loop iterations
var MAX_ITERATIONS = 5; // beware: the number of simultaneous XMLHttpRequest is limited by the browser!
var TIME_PERIOD = 1000; // 1000 ms between each ping
var i = 0;
var over_flag = 0;
var time_cumul = 0;
var REQUEST_TIMEOUT = 9000;
var TIMEOUT_ERROR = 0;

document.getElementById('result').innerHTML = "HTTP ping for " + fqdn + "</br>";

var ping_loop = setInterval(function() {


    // let's change non-existent URL each time to avoid possible side effect with web proxy-cache software on the line
        url = "http://" + fqdn + "/a30Fkezt_77" + Math.random().toString(36).substring(7);

        if (i < MAX_ITERATIONS) {

            var ping = new XMLHttpRequest();

            i++;
            ping.seq = i;
            over_flag++;

            ping.date1 = Date.now();

            ping.timeout = REQUEST_TIMEOUT; // it could happen that the request takes a very long time

            ping.onreadystatechange = function() { // the request has returned something, let's log it (starting after the first one)

                if (ping.readyState == 4 && TIMEOUT_ERROR == 0) {
                    over_flag--;
                    if (ping.seq > 1) {
                        delta_time = Date.now() - ping.date1;
                        time_cumul += delta_time;
                        document.getElementById('result').innerHTML += "</br>http_seq=" + (ping.seq-1) + " time=" + delta_time + " ms</br>";
                    }
                }
            }

            ping.ontimeout = function() {
                TIMEOUT_ERROR = 1;
            }
            ping.open("GET", url, true);
            ping.send();
        }

        if ((i > NB_ITERATIONS) && (over_flag < 1)) { // all requests are passed and have returned

            clearInterval(ping_loop);
            var avg_time = Math.round(time_cumul / (i - 1));
            document.getElementById('result').innerHTML += "</br> Average ping latency on " + (i-1) + " iterations: " + avg_time + "ms </br>";

        }
        if (TIMEOUT_ERROR == 1) { // timeout: data cannot be accurate
            clearInterval(ping_loop);
            document.getElementById('result').innerHTML += "<br/> THERE WAS A TIMEOUT ERROR <br/>";
            return;
        }
    }, TIME_PERIOD);
}

但是,当然,这些是网址,而不是 IP 地址,所以我不确定这是否是您的目标。我也不确定您是否正在寻找获得连接所花费的时间以及发送和接收的数据包和字节数,或者您是否只想验证连接。上面的代码完成了所有这些事情。对于 IP 地址,您可以尝试一个 AJAX 请求来 ping 服务器,它只会使用您服务器的 IP 地址而不是用户的客户端来查看是否存在连接,如下所示:

client --AJAX-- yourserver --ICMP ping-- targetservers

您也可以试试:

  • 将 Java 小程序与 isReachable
  • 一起使用
  • 编写一个可以 ping 的服务器端脚本,并使用 AJAX 与您的服务器端脚本通信
  • 您也许还可以在 Flash 中执行 ping 操作(使用 ActionScript

最后一种获取 IP 地址的假设和非正统方法是检查和查看您提到的网站的源代码并复制一些代码,主要是 Java脚本,并在您的端进行测试并尝试实施它。