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

2022-08-30 11:08:30

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


答案 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,但其他传输协议也是如此)不以这种方式运行,并且除非覆盖的应用层协议实现数据报,否则不会确认数据报。

您以这种方式提出这个问题的事实告诉我,您在传输层协议方面的知识存在根本性差距。您应该阅读ICMPTCP以及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;
}

答案 2

如果OP真的想要一个ICMP-Ping,在用户贡献的注释中有一些建议[link],它们使用原始套接字。请注意,在类UNIX系统上,需要root访问权限。socket_create()

更新:请注意,该参数在窗口上不起作用。最小超时为 1 秒。usec

无论如何,这是投票最多的ping函数的代码:

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

推荐