<?php
/// start ping.inc.php /// $g_icmp_error = "No Error"; // timeout in ms
function ping($host, $timeout)
{
$port = 0;
$datasize = 64;
global $g_icmp_error;
$g_icmp_error = "No Error";
$ident = array(ord('J'), ord('C'));
$seq = array(rand(0, 255), rand(0, 255)); $packet = '';
$packet .= chr(8); // type = 8 : request
$packet .= chr(0); // code = 0 $packet .= chr(0); // checksum init
$packet .= chr(0); // checksum init $packet .= chr($ident[0]); // identifier
$packet .= chr($ident[1]); // identifier $packet .= chr($seq[0]); // seq
$packet .= chr($seq[1]); // seq for ($i = 0; $i < $datasize; $i++)
$packet .= chr(0); $chk = icmpChecksum($packet); $packet[2] = $chk[0]; // checksum init
$packet[3] = $chk[1]; // checksum init $sock = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
$time_start = microtime(true);
socket_sendto($sock, $packet, strlen($packet), 0, $host, $port); $read = array($sock);
$write = NULL;
$except = NULL; $select = socket_select($read, $write, $except, 0, $timeout * 1000);
if ($select === NULL) {
$g_icmp_error = "Select Error";
socket_close($sock);
return -1;
} elseif ($select === 0) {
$g_icmp_error = "Timeout";
socket_close($sock);
return -1;
} $recv = '';
$time_stop = microtime(true);
socket_recvfrom($sock, $recv, 65535, 0, $host, $port);
$recv = unpack('C*', $recv); if ($recv[10] !== 1) // ICMP proto = 1
{
$g_icmp_error = "Not ICMP packet";
socket_close($sock);
return -1;
} if ($recv[21] !== 0) // ICMP response = 0
{
$g_icmp_error = "Not ICMP response";
socket_close($sock);
return -1;
} if ($ident[0] !== $recv[25] || $ident[1] !== $recv[26]) {
$g_icmp_error = "Bad identification number";
socket_close($sock);
return -1;
} if ($seq[0] !== $recv[27] || $seq[1] !== $recv[28]) {
$g_icmp_error = "Bad sequence number";
socket_close($sock);
return -1;
} $ms = bcmul(bcsub($time_stop, $time_start, 6), 1000); if ($ms < 0) {
$g_icmp_error = "Response too long";
$ms = -1;
} socket_close($sock); return $ms;
} function icmpChecksum($data)
{
$bit = unpack('n*', $data);
$sum = array_sum($bit); if (strlen($data) % 2) {
$temp = unpack('C*', $data[strlen($data) - 1]);
$sum += $temp[1];
} $sum = ($sum >> 16) + ($sum & 0xffff);
$sum += ($sum >> 16); return pack('n*', ~$sum);
} function getLastIcmpError()
{
global $g_icmp_error;
return $g_icmp_error;
}
/// end ping.inc.php ///

使用方法:

$ping = ping('www.baidu.com',200);
if ($ping > 0) {
// ok
} else {
// failed
}

PHP ping的更多相关文章

  1. 解决WINDOWS防火墙开启后Ping不通

    WINDOWS系统由于安全考虑,当开启防火墙时,默认不允许外主机对其进行ping功能,即别的电脑ping不通本机.别的主机ping不通本机是因为本机的防火墙关闭了ICMP回显功能,只要把这回显功能打开 ...

  2. Linux不能上网ping:unknown host问题怎么解决?

    Linux不能上网提示ping:unknown host 检查步骤 Linux系统跟windows平台有所不同的是,为了更好的做网络服务应用.Linux下多用于网络服务器,而且操作界面是字符界面.对于 ...

  3. Docker的ubuntu镜像安装的容器无ifconfig和ping命令的解决

    Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令 解决: apt-get update apt install net-tools       # ifconfig apt ...

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

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

  5. 2、实现不同子网之间的信息交流(互相可以PING通)

    一.环境: 二个不同的虚拟子网 VMnet1: 192.168.155.0/24 VMnet8: 192.168.170.0/24 编辑 --> 虚拟网络编辑器 (查看自己的子网,相应修改就行) ...

  6. Linux虚拟机突然网络不能用了但是主机能ping㣈

    虚拟ping主机时出现: linux network is unreachable 搞了好久搞不定,之前都是好的 突然这样了. 解决办法: 第一步: "虚拟机设置"中的" ...

  7. ping环回地址和ping主机地址的区别

    ping127.0.0.1和ping本机的过程是不一样的ip输出函数先检查地址是不是环回地址1.如果是环回地址 直接交给环回驱动程序处理 返回ip输入函数2.如果不是环回地址 检查是不是广播或者多播地 ...

  8. 批量 ping 测试脚本

    是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...

  9. 从C++实现Ping开始说起

    在C++中实现ping功能,并不难.但真正了解ping是需要花费一番功夫的. Ping功能是在ICMP基础上实现的.IP协议并不是一个可靠的协议,它不保证数据被送达,那么,保证数据送达的工作应该由其他 ...

  10. cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机

    服务器网口绑定   1. ifcfg-bond0   DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0   2. ...

随机推荐

  1. pyhon虚拟环境的安装和使用

    安装Python2.7: 1.Mac下使用Python2.7 2.Windows下安装Python2.7. *从python官网下载python2.7的版本 *双击python2.7,然后选择安装路径 ...

  2. sqlserverToXML

    --raw模式 以属性的形式展示select * from goods for xml rawselect *from goods for xml raw('goods') --修改节点名称selec ...

  3. JavaSE之Java基础(2)

    6.java8新特性 Lambda表达式 接口的默认方法与静态方法 方法引用 重复注解 扩展注解的支持 Optional类 Stream API Date Time API JavaScript引擎N ...

  4. JavaSE集合基础总览

    Java集合 Java集合,也称之为容器.基本上你写所有的Java程序,都必须要用到一个包.该API基本都位于java.util工具类包中,是JavaSE中的重中之重.简单可以总结为“1136”,分别 ...

  5. 洛谷 P1195 口袋的天空(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1195 思路: 首先可以判断这道题是用最小生成树来做的,然后在将其合并时用ans记录一下它的总消耗, ...

  6. spring-cloud构架微服务(1)-全局配置

    使用spring-cloud是基于熟悉springboot基础上进行的.本篇介绍全局配置,spring-boot版本就以1.4.0来做吧.项目地址: https://git.oschina.net/b ...

  7. Android设置TextView的行间距,EditText下划线

    textView用于显示文本,大量文字显示在一起显得过于紧凑.可通过在布局中更改TextView属性设置行间距. 1.android:lineSpacingMultiplier="1.5&q ...

  8. isee图片专家批量处理图片大小教程

    经常用手机.照相机外出拍照片,然后再弄到电脑上面很占硬盘空间了,isee图片专家是一款非常专业的批量压缩图片大小工具,方便储存,给电脑减压,具有一次自动处理N张图片:程序小巧,资源占用低,处理速度快等 ...

  9. PB导出规定格式DBF文件 dBase 3 格式 222个字段

    最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...

  10. MySQL数据库实验三:连接查询

    实验三    连接查询 实验名称:连接查询(2课时) 一.实验目的 理解JOIN语句的操作和基本使用方法,掌握内连接.外连接.自身连接的概念和使用. 二.实验环境 是MS SQL SERVER 200 ...