zoukankan      html  css  js  c++  java
  • 用PHP ping 一个 IP

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

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

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

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

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

    所以,最终的实现思路是。用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;
        } 
  • 相关阅读:
    洛谷 P1057 传球游戏
    BZOJ 1801: [Ahoi2009]chess 中国象棋
    BZOJ 1806: [Ioi2007]Miners 矿工配餐
    51nod 1276 岛屿的数量
    BZOJ 1800: [Ahoi2009]fly 飞行棋
    路由控制和视图层
    django的零碎注意点
    Django框架简介
    Bootstrap框架
    jQuery基础知识
  • 原文地址:https://www.cnblogs.com/batsing/p/ping.html
Copyright © 2011-2022 走看看