Как получить мой клиент на сервер ping? - PullRequest
0 голосов
/ 23 июня 2010

Я пытаюсь найти способ, как мои клиенты могут пинговать мой сервер через php, а затем получить результаты в формате, подобном этому «15 мс».

В итоге я нашел способ, с помощью которого серверы могут пинговать серверы. Однако я хочу, чтобы удаленный пользователь как-то пинговал сервер, или, возможно, сервер пинговал клиента, возможно?

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);

Я попробовал эту функцию, где я заставил бы сервер пропинговать клиента, чтобы увидеть время отклика между клиентом / сервером.

fsockopen () [function.fsockopen]: невозможно подключиться к XXXXXXXXXXX: 80

Ответы [ 3 ]

1 голос
/ 23 июня 2010

Я пытаюсь найти способ, как мои клиенты могут пинговать мой сервер через php

Почему? Какая ценность в знании этой информации? Хотя я заметил, что ответ Эмиля не касается вопроса, он может решить проблему - время, необходимое для того, чтобы ICMP-пакет отправился на сервер и вернулся, будет отличаться от времени, необходимого для завершения TCP-квитирования на порту 80. через Интернет (они должны быть примерно одинаковыми в локальной сети, если веб-сервер не насыщен).

Если вы хотите получить точную информацию о времени RTT, то лучшим решением будет использование инструмента / программного обеспечения для мониторинга сети. PastMon является очевидным кандидатом.

Если вам действительно нужно отправить пинг с клиента, то вам нужно сделать это с помощью java-апплета / flash / activeX (при условии, что они имеют низкоуровневый доступ к стеку TCP, необходимый для выполнения пинга).

С

0 голосов
/ 23 июня 2010

Вы должны сделать это в JavaScript.Клиент вообще не может запустить PHP, и ваша попытка пропинговать клиента не будет работать, когда его брандмауэр блокирует запросы извне (что часто имеет место).

Создайте функцию "ping" в JS, которая выбираетстраницу несколько раз от 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, но она может быть использована, чтобы позволить серверу теперь, когда это последний пинг-запрос.Обратите внимание, что этот код доверяет клиенту, а это означает, что вам может потребоваться дополнительная работа по обеспечению безопасности на стороне сервера (может быть, убрать понятие «ops» со стороны сервера и просто отправить пинг?).Кроме того, вам, вероятно, нужны разные счетчики для каждой страницы, возможно, идентифицированные по некоторому токену, который вы возвращаете в первом запросе.

Также обратите внимание, что это зависит также от задержки HTTP и ЦП, а не только от сети, ноЯ думаю, что это так хорошо, как вы можете это получить.

0 голосов
/ 23 июня 2010

Что заставляет вас думать, что клиенты будут надежно отвечать на эхо-запросы ICMP?

Лучшим решением было бы написание клиентского Java-апплета (или JavaScript?) Для проверки связи с вашим сервером.

Помните, что из-за ограничений безопасности оба языка будут ограничиваться обменом данными только с исходным сервером.Вы не сможете позволить вашим пользователям пинговать сервер, кроме вашего собственного ... но в вашем случае это не проблема.

...