Сгенерировать IP-адрес и подсеть + пинг [дублировать]

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

«Необработанный тип» - это использование общего класс без указания аргумента (ов) типа для его параметризованного типа (ов), например используя List вместо List<String>. Когда дженерики были введены в Java, несколько классов были обновлены для использования дженериков. Использование этого класса в качестве «необработанного типа» (без указания аргумента типа) позволило сохранить прежний код.

«Необработанные типы» используются для обратной совместимости. Их использование в новом коде не рекомендуется, потому что использование универсального класса с аргументом типа допускает более сильную типизацию, что, в свою очередь, может улучшить понятность кода и привести к появлению потенциальных проблем раньше.

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

. Предпочтительной альтернативой является использование общих классов, как предполагалось, - с подходящим аргументом типа (например, List<String>). Это позволяет программисту более конкретно указывать типы, придавая будущим сопровождающим больше смысла предполагаемое использование переменной или структуры данных и позволяет компилятору обеспечивать лучшую безопасность типов. Эти преимущества вместе могут улучшить качество кода и помочь предотвратить появление некоторых ошибок кодирования.

Например, для метода, в котором программист хочет, чтобы переменная List, называемая «имена», содержит только строки:

List<String> names = new ArrayList<String>();
names.add("John");          // OK
names.add(new Integer(1));  // compile error
14
задан STT LCU 10 December 2013 в 11:02
поделиться

8 ответов

ПРИМЕЧАНИЕ. Решение ниже не работает в Windows. В linux exec команда «which ping» из консоли и заданный путь команды (предлагаемого вызова exec) соответственно

Я думаю, вы хотите проверить статус выхода команды, тогда как shell_exec дает вам полную выход (может быть опасным, должен командовать выходом из командной строки до версии) по какой-либо причине). Более того, переменная $ ip не интерпретируется в одинарных кавычках. Вам придется использовать двойные "". Это может быть единственное, что вам нужно исправить, чтобы заставить его работать.

Но я думаю, что следующий код может быть более «портативным». ИМХО, на самом деле лучше поймать статус выхода, а не пытаться проанализировать строку результата. IMHO также лучше указать полный путь к команде ping.

<?php
function pingAddress($ip) {
    $pingresult = exec("/bin/ping -n 3 $ip", $outcome, $status);
    if (0 == $status) {
        $status = "alive";
    } else {
        $status = "dead";
    }
    echo "The IP address, $ip, is  ".$status;
}

pingAddress("127.0.0.1");
15
ответ дан maraspin 20 August 2018 в 18:03
поделиться
  • 1
    HI maraspin, попытался использовать эту функцию выше, но это скажет, что даже 999.999.999.999 жив, когда я пытаюсь это сделать - может быть что-то еще не так? Не могли бы вы предложить советы по устранению неполадок? – Bernard 7 November 2011 в 01:22
  • 2
    1) ping, как и большинство утилит командной строки UNIX, возвращает 0 при успехе, а не 1. 2) OP использует Windows, поэтому /bin/ping т работы. – duskwuff 7 November 2011 в 01:27
  • 3
    удаление / bin / и смена 0 на 1, похоже, сработали - спасибо всем. – Bernard 7 November 2011 в 01:39
  • 4
    @duskwuff: ты прав, я плохой. Я даже не рассматривал 1 (и имел в виду все другие коды ошибок UNIX std), но при первом редактировании я сначала поставил худший случай; Затем я решил, что лучше иметь номинальный случай в первую очередь. Но забыл заменить! = С ==. Вот в чем проблема. Исправлено в коде выше. Что касается пути / bin / ping, вы также правы. + 1д. В моей команде ответа нужно изменить на любое место команды ping, которое нужно вызвать. – maraspin 7 November 2011 в 01:42
  • 5
    @Michele попробуйте вместо этого использовать ключ -c – maraspin 16 January 2018 в 16:37

это отлично работает для меня ..

$host="127.0.0.1";
$output=shell_exec('ping -n 1 '.$host);

echo "<pre>$output</pre>"; //for viewing the ping result, if not need it just remove it

if (strpos($output, 'out') !== false) {
    echo "Dead";
}
    elseif(strpos($output, 'expired') !== false)
{
    echo "Network Error";
}
    elseif(strpos($output, 'data') !== false)
{
    echo "Alive";
}
else
{
    echo "Unknown Error";
}
1
ответ дан Arif Yaacob 20 August 2018 в 18:03
поделиться

Проверяйте страницы руководства вашей команды ping перед тем, как попробовать некоторые из этих примеров (всегда хорошая практика). Например, для Ubuntu 16 принятый ответ не работает, поскольку -n 3 терпит неудачу (это больше не количество пакетов, -n означает не преобразование IP-адреса в имя хоста).

После запроса OP потенциальная альтернативная функция будет следующей:

function checkPing($ip){
    $ping = trim(`which ping`);
    $ll = exec($ping . '-n -c2 ' . $ip, $output, $retVar);
    if($retVar == 0){
        echo "The IP address, $ip, is alive";
        return true;
    } else {
        echo "The IP address, $ip, is dead";
        return false;
    }
}
0
ответ дан bnoeafk 20 August 2018 в 18:03
поделиться

Это отлично работает с именем хоста, обратным IP (для внутренних сетей) и IP.

function pingAddress($ip) {
    $ping = exec("ping -n 2 $ip", $output, $status);
    if (strpos($output[2], 'unreachable') !== FALSE) {
        return '<span style="color:#f00;">OFFLINE</span>';
    } else {
        return '<span style="color:green;">ONLINE</span>';
    }
}

echo pingAddress($ip);
0
ответ дан ChristianG 20 August 2018 в 18:03
поделиться
  • 1
    Никогда не используйте пользовательский ввод непосредственно в exec. См. этот вопрос для правильного способа дезинфекции входных данных пользователя. – Linek 22 March 2017 в 13:16
  • 2
    – ChristianG 22 March 2017 в 13:21

Это тоже не работало для меня в Wordpress. Я также пробовал -t и -n и другие способы, но не работал. Я использовал

function pingAddress($ip) {
    $pingresult = exec("/bin/ping -c2 -w2 $ip", $outcome, $status);  
    if ($status==0) {
    $status = "alive";
    } else {
    $status = "dead";
    }
    $message .= '<div id="dialog-block-left">';
    $message .= '<div id="ip-status">The IP address, '.$ip.', is  '.$status.'</div><div style="clear:both"></div>';    
    return $message;
}
// Some IP Address
pingAddress("192.168.1.1"); 

. Это отлично сработало для меня, наконец. Я ссылался на это из http://www.phpscriptsdaily.com/php/php-ping/ Надеюсь, это поможет

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

$fp = fSockOpen($ip,80,$errno,$errstr,1);
if($fp) { $status=0; fclose($fp); } else { $status=1; }

Затем я показываю, что сервер для 0 и вниз для 1 .

Это отлично работает для меня. Я получил это из сайта Ping и вернул результат в PHP Спасибо @ karim79

6
ответ дан Community 20 August 2018 в 18:03
поделиться

Для Windows Используйте этот класс

$host = 'www.example.com';
$ping = new Ping($host);
$latency = $ping->ping();
if ($latency !== false) {
 print 'Latency is ' . $latency . ' ms';
}
else {
print 'Host could not be reached.';
}

https://github.com/geerlingguy/Ping

1
ответ дан Kuldeep 20 August 2018 в 18:03
поделиться

Я использую эту функцию:

<?php
function is_ping_address($ip) {
    exec('ping -c1 -w1 '.$ip, $outcome, $status);
    preg_match('/([0-9]+)% packet loss/', $outcome[3], $arr);
    return ( $arr[1] == 100 ) ? false : true;
}
0
ответ дан Mcile 20 August 2018 в 18:03
поделиться

Я разработал алгоритм работы с гетерогенной ОС, как Windows, так и Linux.

Внедрение следующего класса:

<?php

    class CheckDevice {

        public function myOS(){
            if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78)))
                return true;

            return false;
        }

        public function ping($ip_addr){
            if ($this->myOS()){
                if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)"))
                    return true;
            } else {
                if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?"))
                    return true;
            }

            return false;
        }
    }

    $ip_addr = "151.101.193.69"; #DNS: www.stackoverflow.com

    if ((new CheckDevice())->ping($ip_addr))
        echo "The device exists";
    else 
        echo "The device is not connected";
0
ответ дан Samuel Liew 20 August 2018 в 18:03
поделиться
  • 1
    Пожалуйста, не повторяйте похожие ответы на несколько вопросов. Вместо этого приложите ответ на заданный вопрос. Если вопрос слишком широк или дублирует друг друга, отметьте вместо него модератора. – Samuel Liew♦ 28 March 2018 в 23:57
  • 2
    О, понял джентльмен. Большое спасибо. – Jerson Martínez 29 March 2018 в 00:22
Другие вопросы по тегам:

Похожие вопросы: