Как заставить пользователя на моем сайте пинговать определенный IP-адрес? - PullRequest
0 голосов
/ 30 апреля 2019

Мне интересно, как веб-сайту нравится этот: https://ping.eu/ping/ удается сделать наш ip-пинг другим ip и получить результат.

У кого-нибудь есть идея?

Спасибо

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Это не так.Сценарий PHP (на сервере), скорее всего, сделает это с помощью «PHP Sockets».Взгляните на это: https://www.php.net/manual/en/sockets.examples.php

В противном случае он мог бы использовать функцию exec (), но это было бы недостатком безопасности.

Итак, чтобы ответить на ваш вопрос: сайт будет пинговать IPадрес не "клиент"

0 голосов
/ 30 апреля 2019

Если вы хотите пропинговать сервер, то есть фактический веб-адрес / URL, такой как www.google.com, вы можете посмотреть на этот 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);
  }
}

Другой способ проверить связь с сервером / веб-адресом - использовать 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-запрос для проверки связи с сервером, который только видит, существует ли соединение с использованием IP-адреса ВАШЕГО СЕРВЕРА, а НЕ КЛИЕНТА ПОЛЬЗОВАТЕЛЯ, например:

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

Вы также можете попробовать:

  • Использование Java-апплета с isReachable
  • Написание сценария на стороне сервера, который проверяет связь, и использование AJAX для связи с вашим сценарием на стороне сервера
  • Вы также можете пинговать во Flash (используя ActionScript)

Один из последних гипотетических и неортодоксальных способов получения IP-адреса состоит в том, чтобы проверить и просмотреть источник сайта, который вы упомянули, и скопировать некоторый код, в основном JavaScript, и протестировать его со своей стороны и попытаться реализовать его.

...