我怎样才能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); ?> 

我想要这个游戏服务器。

我的想法是,我可以inputIP地址和端口号,我得到了ping响应。

我想这个问题的答案几乎总结了你的问题的问题。

如果你想要做的是找出一个给定的主机是否接受端口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以外的任何东西都会更加困难(尽pipe你指定了80,我猜你正在寻找一个活跃的HTTP服务器,所以TCP就是你想要的)。 TCP被sorting并被确认,所以当连接成功时你将隐含地接收到一个返回的数据包。 大多数其他传输协议(通常是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; } 

如果OP确实需要一个ICMP-Ping,在socket_create() [link]的User Contributed Notes中有一些使用原始套接字的提议。 请注意,在UNIX系统上,需要root权限。

更新:请注意, usec参数在窗口上没有function。 最小超时是1秒。

在任何情况下,这是顶级投票pingfunction的代码:

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

尝试这个 :

 echo exec('ping -n 1 -w 1 72.10.169.28'); 

你不需要任何exec或shell_exec黑客来做到这一点,有可能在PHP中做到这一点。 这本书“你想用PHP做什么? 由凯文施罗德,节目的如何。

它使用套接字和pack()函数来读写二进制协议。 你需要做的是创build一个ICMP数据包,你可以使用'CCnnnA *'格式创build你的数据包。

testing不同的端口:

 $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 
 function ping($ip){ $output = shell_exec("ping $ip"); var_dump($output); } ping('127.0.0.1'); 

socket_create需要以root身份在UNIX系统上运行;

 $socket = socket_create(AF_UNIX, SOCK_STREAM, 0); 

如果你想在php中发送ICMP数据包,你可以看看这个Native-PHP ICMP ping实现 ,但是我没有testing它。

你可以使用exec函数

  exec("ping ".$ip); 

这里是一个例子