最近要做一个 测试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;
}

用PHP ping 一个 IP的更多相关文章

  1. shell ping一个IP,延时大于5,输出延时大于5s,打印输出

    # ping一个IP,延时大于5,输出延时大于5s,打印输出 #!/bin/bash ip=$* echo $ip num=`ping  -c 10 ${ip}|grep icmp_seq|awk ' ...

  2. c# 判断一个ip通不通 能不能ping通

    方法一: 已经证实能用的. using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  3. 使用shell脚本实现ping对应IP所对应的人名

    #!/bin/bash a=(张三 李四 王五 赵六) ..} do . $((${i}+)) >dev/>&;then ))"号"${a[${i}]}&quo ...

  4. Linux下shell脚本中信号捕获和函数练习脚本之ping一个网段

    该脚本主要的目的是练习在Linux bash脚本中捕获信号,顺便练习一下函数的使用,还有就是终止一个正在运行的程序后,该程序打开的文件的后续处理问题等等!脚本功能:  ping一个网段内的IP,检测哪 ...

  5. 【随笔】使用mOnOwall封禁某一个ip

    有时候,查看服务器日志时会发现某些人的恶意登录记录: 这时候,我们就要把这个ip封掉. 首先ping一下这个ip: 然后打开monowall路由页面,点击Firewall-->Rules: 点击 ...

  6. 一键批量ping任意ip段的存活主机

    =======================by me===================================== @echo offecho.color FC for /f %%i ...

  7. 如何利用python教程判断一个 IP 在不在线?

    假设今天老板给我们一个任务,让我们判断一下一个 IP 在不在线.我们随手用 python 写一个 ping IP 的代码: import os host = input('请输入要检测的 IP : ' ...

  8. linux 能ping通IP但无法解析域名

    vi /etc/nsswitch.conf hosts: files dns networks: files 改成: hosts: files dns wins networks: files 最近碰 ...

  9. WireShark——IP协议包分析(Ping分析IP协议包)

    互联网协议 IP 是 Internet Protocol 的缩写,中文缩写为“网协”.IP 协议是位于 OSI 模型中第三层的协议,其主要目的就是使得网络间能够互联通信.前面介绍了 ARP 协议, 该 ...

随机推荐

  1. nginx集群tomcat

    一.准备工作 下载nginx,http://nginx.org/,本文采用nginx-1.8.0,下载之后直接解压,免安装 下载tomcat,以配置3台tomcat服务器做负载均衡为例 二.修改tom ...

  2. PHP文件夹文件拷贝/复制函数 dir_copy($src = '', $dst = '')

    /* * 文件夹文件拷贝 * * @param string $src 来源文件夹 * @param string $dst 目的地文件夹 * @return bool */ function dir ...

  3. docker的资源限制cpuset cpuquota memory

    总结 目前,公司7u已经不再使用lxc,转而使用libcontainer 即native docker对cpuquota的支持目前是有问题的,一般大家使用docker的时候,主要是对memory,cp ...

  4. HTML <head>

    HTML <head> 元素 <head> 元素包含了所有的头部标签元素.在 <head>元素中你可以插入脚本(scripts), 样式文件(CSS),及各种met ...

  5. JSP EL表达式使用

    JSP EL表达式使用: Servlet: package com.stono.servlet; import java.io.IOException; import java.util.HashMa ...

  6. Spring @Aspect实现切面编程

    参考:http://blog.csdn.net/cdl2008sky/article/details/6268628 参考:http://www.360doc.com/content/12/0602/ ...

  7. 我的2016年终总结(PF项目框架设计心得分享 2.0rc)

    在无数的日夜里,熬出了多少的黑眼圈,致勤勤恳恳工作的各位朋友与自己.每到了年末的时候总想写的什么,主要是为了回顾以往一年里到底做了什么,这便是年终总结的主要意义.在此我将要总结的是和我在技术层面上成长 ...

  8. Oracle BEQ方式连接配置

    Oracle BEQ方式连接配置 服务端和客户端在同一台机器上,可以使用BEQ连接,BEQ连接可以理解为进程间直接通信,不需要走网络监听,性能更高. 可以参考MOS:How To Connect Us ...

  9. easyui datagrid的json格式

    easyui datagrid的json格式: {"columns":[[{"field":"one","title": ...

  10. [UWP]依赖属性1:概述

    1. 概述 依赖属性(DependencyProperty)是UWP的核心概念,它是有DependencyObject提供的一种特殊的属性.由于UWP的几乎所有UI元素都是集成于DependencyO ...