php端口检测代码:php实现tcp端口检测的方法

发布时间:2019-08-24编辑:脚本学堂
如何用php实现tcp端口检测,一例php端口检测代码,检查当前端口是否可用,了解下php操作tcp端口检测的方法,并介绍了一个php socket检测链接是否有效的例子。

php实现tcp端口检测的方法,有关php操作tcp端口检测的技巧。

php实现tcp端口检测

例子,检查当前端口是否可用:
 

复制代码 代码示例:
<?php
class Health {
public static $status;
public function __construct()
{
}
public function check($ip, $port){
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sock);
socket_connect($sock,$ip, $port);
socket_set_block($sock);
self::$status = socket_select($r = array($sock), $w = array($sock), $f = array($sock), 5);
return(self::$status);
}
public function checklist($lst){
}
public function status(){
switch(self::$status)
{
case 2:
echo "Closedn";
break;
case 1:
echo "Openningn";
break;
case 0:
echo "Timeoutn";
break;

}
}
$ip='192.168.2.10';
$port=80;
$health = new Health();
$health->check($ip, $port);
$health->status();

二、php socket检测链接是否有效的方法

在php中利用现有的Socket开发环境,开发出基于Socket信息传递和反馈的程序。
在http协议中,所有的请求都是要经过http报头封装传递给服务器的,服务器在接受到申请之后,然后根据用户提交的信息查找服务器上的资料,不管有还是没有这个文件,都会反馈一个http报头给用户。

可以利用Socket创建报头和接受反馈的报头,根据报头的代码编号来判断请求是否存在。

例子:
 

复制代码 代码示例:
<?
/**
* 说明:检测url地址是否有效
*/ www.jb200.com
error_reporting(E_ALL & ~E_NOTICE);
function _GetMicrotime()
{
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function _CatInfoToArray($urls)
{
/*
$url格式:<a href="http://wwww.xxxx.com:88800/root/file" target="_blank">http://wwww.xxxx.com:88800/root/file</a>
剥离信息url集合的信息
取得 $add 地址 $ip $port $froot $httpd
将上述信息存入一个新的数组
*/
$newurlarr = array();
foreach ($urls as $uk=>$url)
{
$urlarr = explode("://",$url);
$urlarr = explode("/",$urlarr[1]);
$hostinfo = explode(":",$urlarr[0]); // <a href="http://www.xxxx.com:88800" target="_blank">www.xxxx.com:88800</a>
$add[$uk] = $hostinfo[0];
if($hostinfo[1]!="")
{
$port[$uk] = $hostinfo[1]; //如果地址带端口,使用地址给出的端口
}
else
{
$port[$uk] = getservbyname('www', 'tcp'); //如果地址没带端口,返回wwww端口
}
/*开始重新组合,生成新的文件探测地址*/
if(count($urlarr) !=1 && $urlarr[1]!="")
{
foreach ($urlarr as $k=>$urlitem)
{
if($k !=0) $froot[$uk] .= "/".$urlitem;
}
}
if($froot[$uk]=="") $froot[$uk]="/"; //如果探测址为空,就探测根目录
/*
OK,现在我们开始创建http报头
*/
$ip[$uk] = gethostbyname($hostinfo[0]); //返回ip
$httpd[$uk] = "GET $froot[$uk] HTTP/1.1rn";
$httpd[$uk] .= "Host: ".$hostinfo[0]."rn";
$httpd[$uk] .= "Connection: Closernrn";
/*信息收集完毕,创建数组*/
$newurlarr[$uk] = array($url,$ip[$uk],$port[$uk],$froot[$uk],$httpd[$uk]);
}
return $newurlarr;
}
function _Socket($infos)
{
/*
将_CatInfoToArray生成的数组一次进行Socket分析
*/
foreach ($infos as $k=>$info)
{
/*
开始创建多Socket线程
*/
$socket{$k} = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建Socket
}
foreach ($infos as $k=>$info)
{
$starttime{$k} = _GetMicrotime(); //取得开始时间
$result[$k] = @socket_connect($socket{$k}, $info[1], $info[2]);//发起连接
if (!$result[$k])
{
$rsl[$k]="链接超时";
}
else
{
@socket_write($socket{$k}, $info[4], strlen($info[4])); //发送Http报头
$out = @socket_read($socket{$k}, 20); //读取返回,只读取50个字节的数据就行了
@socket_close($socket{$k}); // 关闭socket连接
$out = explode("n",$out); //分离每一行
$http = explode(" ",$out[0]);//第一行包含了报头是否存在的信息
if($http[1]=="404") //如果是404,就是不存在
{
$rsl[$k]="无效链接";
}
else
{
$rsl[$k]="有效链接";
}
}
$runtime[$k] = _GetMicrotime() - $starttime{$k}; //计算探测时间
$socketarr[$k] = array($info[0],$rsl[$k],$runtime[$k]); //返回新的数组,包含了地址,探测结果,以及探测消耗时间
}
return $socketarr;
}
function _CheckLink($array)
{
$a = _CatInfoToArray($array);
$b = _Socket($a);
return $b;
}
/*-----------------------------开始使用------------------------------------------------*/
echo "[链接探测器]<pre>";
$time_start = _GetMicrotime();
/*链接需要以数组的方式提交查询*/
$urlarr = array(
"http://vwww.jb200.com/1.htm",
"http://www.baidu.com",
"http://www.sina.com.cn/3.htm",
"http://www.google.com/4.htm"
);
echo "OK,我们来打印一下查询到的信息吧<br>";
print_r(_CheckLink($urlarr)); //打印查询的信息,是一个数组哦]
$time_end = _GetMicrotime();
echo "页面执行时间 ";
echo $time_end-$time_start;
?>