【发布时间】:2019-04-29 23:27:34
【问题描述】:
【问题讨论】:
-
你试过我的答案了吗?
【问题讨论】:
它没有。 PHP 脚本(在服务器上)很可能会使用“PHP Sockets”来完成。看一下 这个:https://www.php.net/manual/en/sockets.examples.php
否则它可以使用 exec() 函数,但这将是一个安全漏洞。
所以回答你的问题:网站将 ping IP 地址而不是“客户端”
【讨论】:
如果你想 ping 一个服务器,即像 www.google.com 这样的实际网址/URL,你可以查看这个 JSFiddle http://jsfiddle.net/GSSCD/203/ 或 GitHub 存储库 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 服务器/网址的另一种方法是使用 JavaScript 和它支持的 XMLHttpRequest() 函数:
HTML:
<div id="result"></div>
JavaScript:
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
你也可以试试:
isReachable 的Java 小程序
ActionScript)获取 IP 地址的最后一种假设和非正统方法是检查和查看您提到的网站的源代码,并复制一些代码,主要是 JavaScript,然后在您的终端进行测试并尝试实现它。
【讨论】: