一尘不染

如何使用PHP ping服务器端口?

php

我想要一个PHP脚本,它允许您ping IP地址和端口号(ip:port)。我找到了类似的脚本,但是它仅适用于网站,而不适用于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);

?>

我想要一个游戏服务器。

这个想法是我可以输入IP地址和端口号,然后得到ping响应。


阅读 335

收藏
2020-05-26

共1个答案

一尘不染

我认为这个问题的答案几乎可以概括您的问题。

如果您要查找给定主机是否将在端口80上接受TCP连接,则可以执行以下操作:

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

对于TCP以外的任何其他东西,都会更加困难(尽管由于您指定了80,所以我想您正在寻找活动的HTTP服务器,所以TCP是您想要的)。TCP已排序并得到确认,因此成功建立连接后,您将隐式接收返回的数据包。大多数其他传输协议(通常是UDP,但也有其他传输协议)不会以这种方式运行,除非覆盖的应用层协议实现了数据报,否则不会确认数据报。
你要求以这种方式这个问题的事实告诉我,你有你的知识的根本差距传输层协议。您应该阅读ICMP和TCP以及OSI模型。

另外,这是对主机ping 的较干净的版本。

// 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;
}
2020-05-26