it-swarm.com.de

Wie kann ich einen Serverport mit PHP pingen?

Ich möchte ein Skript PHP, mit dem Sie eine IP-Adresse und eine Portnummer (ip:port) anpingen können. Ich habe ein ähnliches Skript gefunden, aber es funktioniert nur für Websites, nicht für ip:port.

<?php

function ping($Host, $port, $timeout) 
{ 
  $tB = microtime(true); 
  $fP = fSockOpen($Host, $port, $errno, $errstr, $timeout); 
  if (!$fP) { return "down"; } 
  $tA = microtime(true); 
  return round((($tA - $tB) * 1000), 0)." ms"; 
}

//Echoing it will display the ping if the Host is up, if not it'll say "down".
echo ping("www.google.com", 80, 10);

?>

Ich möchte das für einen Spieleserver.

Die Idee ist, dass ich die IP-Adresse und die Portnummer eingeben kann, und ich bekomme die Ping-Antwort.

39
user1288533

Ich denke, die Antwort auf diese Frage fasst das Problem ziemlich genau mit Ihrer Frage zusammen.

Wenn Sie herausfinden möchten, ob ein bestimmter Host .__ akzeptiert. TCP Verbindungen an Port 80 können Sie Folgendes tun:

$Host = '193.33.186.70'; 
$port = 80; 
$waitTimeoutInSeconds = 1; 
if($fp = fsockopen($Host,$port,$errCode,$errStr,$waitTimeoutInSeconds)){   
   // It worked 
} else {
   // It didn't work 
} 
fclose($fp);

Für alles andere als TCP wird es schwieriger sein (obwohl Sie seit 80 angegeben haben, denke ich, dass Sie nach einem aktiven HTTP-Server suchen, also TCP ist das, was Sie wollen). TCP wird sequenziert und bestätigt, Sie werden also Empfangen Sie implizit ein zurückgesendetes Paket, wenn eine Verbindung erfolgreich hergestellt wurde gemacht. Die meisten anderen Transportprotokolle (im Allgemeinen UDP, aber andere als ) Verhalten sich nicht auf diese Weise und Datagramme werden nicht bestätigt, es sei denn, das überlagerte Application Layer-Protokoll implementiert es.

Die Tatsache, dass Sie diese Frage auf diese Weise stellen, sagt Ihnen. haben eine grundlegende Wissenslücke auf Transport Layer protocols . Sie sollten sich über ICMP und TCP sowie über das OSI Model informieren.

Hier ist auch eine etwas sauberere Version, um an Hosts zu pingen.

// Function to check response time
function pingDomain($domain){
    $starttime = microtime(true);
    $file      = fsockopen ($domain, 80, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;

    if (!$file) $status = -1;  // Site is down
    else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}
65
ShadowScripter

Falls das OP wirklich einen ICMP-Ping wollte, gibt es einige Vorschläge in den vom Benutzer erstellten Anmerkungen zu socket_create()[link] , die Raw-Sockets verwenden. Beachten Sie, dass auf UNIX-ähnlichen Systemen Root-Zugriff erforderlich ist.

Update: Beachten Sie, dass das Argument usec unter Windows keine Funktion hat. Mindestdauer beträgt 1 Sekunde.

In jedem Fall ist dies der Code der am besten gewählten Ping-Funktion:

function ping($Host, $timeout = 1) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket  = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $Host, null);
    $ts = microtime(true);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {
        $result = microtime(true) - $ts;
    } else {
        $result = false;
    }
    socket_close($socket);
    return $result;
}
17
user1931751

Versuche dies :

echo exec('ping -n 1 -w 1 72.10.169.28');
4
David Bélanger

Testen Sie verschiedene Ports:

$wait = 1; // wait Timeout In Seconds
$Host = 'example.com';
$ports = [
    'http'  => 80,
    'https' => 443,
    'ftp'   => 21,
];

foreach ($ports as $key => $port) {
    $fp = @fsockopen($Host, $port, $errCode, $errStr, $wait);
    echo "Ping $Host:$port ($key) ==> ";
    if ($fp) {
        echo 'SUCCESS';
        fclose($fp);
    } else {
        echo "ERROR: $errCode - $errStr";
    }
    echo PHP_EOL;
}


// Ping example.com:80 (http) ==> SUCCESS
// Ping example.com:443 (https) ==> SUCCESS
// Ping example.com:21 (ftp) ==> ERROR: 110 - Connection timed out
2
Geo
function ping($ip){
    $output = Shell_exec("ping $ip");
    var_dump($output);
}
ping('127.0.0.1');

UPDATE: Wenn Sie eine fest codierte IP-Adresse übergeben (wie in diesem Beispiel und bei den meisten realen Szenarien), kann diese Funktion ausreichend sein. 

Da einige Benutzer jedoch sehr besorgt über die Sicherheit zu sein scheinen, erinnern Sie sich bitte an never, um vom Benutzer generierte Eingaben an die Shell_exec-Funktion zu übergeben: Wenn die IP-Adresse aus einer nicht vertrauenswürdigen Quelle stammt, überprüfen Sie sie zumindest mit mit einem filter vor der Verwendung.

2
T30

Sie benötigen dafür keine Exec oder Shell_exec-Hacks, dies ist in PHP möglich. Das Buch "Sie wollen mit PHP was machen?" von Kevin Schroeder, wie's geht.

Es verwendet Sockets und die Funktion pack(), mit der Sie binäre Protokolle lesen und schreiben können. Sie müssen ein ICMP-Paket erstellen, das Sie mithilfe des Formats "CCnnnA *" zum Erstellen Ihres Pakets erstellen können.

2
markus

Sie können die Funktion exec verwenden

 exec("ping ".$ip);

hier ein Beispiel

0
Jackie

Wenn Sie ICMP-Pakete in PHP senden möchten, können Sie diese Native-PHP-ICMP-Ping-Implementierung betrachten, aber ich habe es nicht getestet.

0
jcubic

socket_create muss auf einem UNIX-System mit root als root ausgeführt werden.

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
0
PodTech.io