用PHPping一个IP

最近要做一个 测试IP列表 是否能连通的功能。大家都知道我们一般用 ping 命令就可以看到IP端口可不可以连通。那在程序里要怎么做呢?

我们在网上找到很多都是使用  exec("ping XXX")  的方式,然而这种方式有很大的安全隐患,exec() 是直接执行一个shell指令。由于其危险性,甚至很多公司都把此函数禁用了。况且就算不考虑其安全性,执行一个 ping 命令,它的等待返回都要好几秒钟(参考命令行的ping),这样的做法也并不理想。

那么除了调用系统的ping命令,我们还有什么办法来连接其它的IP呢?当然是有的。

1. curl 是一种远程获取文件的方式之一。但见其名可知,url,也就是说所连接的是一个网址,而必须那个网址上有一个可访问的文件或者API接口。但是测试我们的IP,并不一定在其下有一个文件或者可以访问,所以并不是一个好的方案。

2. socket 是一种两台机器间进行通信的协议,其中又分为客户端和服务端。它是先建立连接,再进行数据传送。那也可以说,我们可以只建立连接,而不进行数据传输。

用PHPping一个IP

所以,最终的实现思路是。用PHP模拟成一个socket客户端,连接指定的计算机端口(默认为 80 吧),然后就能判断是否能能连通了。代码如下:

<?php
    //ping一个IP地址,能不能通
    function ping($ip){
        $ip_port = explode(':', $ip);
//        var_dump($ip_port);
        if( filter_var( $ip_port[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ){        //IPv6
            $socket = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
        }elseif( filter_var( $ip_port[0], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ){    //IPv4
            $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        }else{
            return FALSE;
        }
        
        if( !isset($ip_port[1]) ){        //没有写端口则指定为80
            $ip_port[1] = '80';
        }
        $ok = socket_connect($socket, $ip_port[0], $ip_port[1]);
//        var_dump( socket_strerror( socket_last_error($socket) ) );
        socket_close($socket);
//        var_dump($ok);
        return $ok;
    } 
更多相关文章
  • 如题,为什么不能像普通的http那样做多个虚拟主机.如果这样,像cloudflare这种提供https访问的服务商需要多少ip才够啊? SSL 的早期版本(主要是 IE6 还在用)不支持 SNI, SNI 是一种允许客户端在建立 SSL 连接之前发送域名的技术,以便服务器发送对应的 HTTPS 证书 ...
  • 目标IP没有装任何web或者http应用 能否用JavaScript来实现ping这样的一个IP,功能类似与console下的ping ip 如评论所说, 浏览器无法构建自定义包, 所以不可能ping, js仅支持http. function Pinger_ping(ip, callback) { ...
  • FreeBSD, Debian, CentOS下一个网卡绑定多个IP
    1. FreeBSD:配置/etc/rc.confifconfig_interface="inet 192.168.1.5 255.255.255.0"ifconfig_interface_alias0="inet 192.168.1.6 255.255.255.0&q ...
  • 析独立ip空间与共享ip空间的区别是什么呢?我们其实很容易理解,共享IP就是一个IP可以有N个网站,独立IP就是一个网站一个IP了,那么这样对于SEO有什么影响呢,下面来给各位分享一经验吧.很多朋友在买空间的时候都会遇见这个问题,独立ip空间与共享ip空间有什么区别?哪个对于优化来说更有利呢?独立i ...
  • 本文章介绍了在java中IP地址转换十进制数及把10进制再转换成IP地址的程序代码吧.先看实例 代码如下 class ip { private static long iptolong(string strip) //将127.0.0.1 形式的ip地址转换成10进制整数,这里没有进行任何错误处理 ...
一周排行