PHP ping
<?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的更多相关文章
- 解决WINDOWS防火墙开启后Ping不通
WINDOWS系统由于安全考虑,当开启防火墙时,默认不允许外主机对其进行ping功能,即别的电脑ping不通本机.别的主机ping不通本机是因为本机的防火墙关闭了ICMP回显功能,只要把这回显功能打开 ...
- Linux不能上网ping:unknown host问题怎么解决?
Linux不能上网提示ping:unknown host 检查步骤 Linux系统跟windows平台有所不同的是,为了更好的做网络服务应用.Linux下多用于网络服务器,而且操作界面是字符界面.对于 ...
- Docker的ubuntu镜像安装的容器无ifconfig和ping命令的解决
Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令 解决: apt-get update apt install net-tools # ifconfig apt ...
- 使用shell脚本实现ping对应IP所对应的人名
#!/bin/bash a=(张三 李四 王五 赵六) ..} do . $((${i}+)) >dev/>&;then ))"号"${a[${i}]}&quo ...
- 2、实现不同子网之间的信息交流(互相可以PING通)
一.环境: 二个不同的虚拟子网 VMnet1: 192.168.155.0/24 VMnet8: 192.168.170.0/24 编辑 --> 虚拟网络编辑器 (查看自己的子网,相应修改就行) ...
- Linux虚拟机突然网络不能用了但是主机能ping㣈
虚拟ping主机时出现: linux network is unreachable 搞了好久搞不定,之前都是好的 突然这样了. 解决办法: 第一步: "虚拟机设置"中的" ...
- ping环回地址和ping主机地址的区别
ping127.0.0.1和ping本机的过程是不一样的ip输出函数先检查地址是不是环回地址1.如果是环回地址 直接交给环回驱动程序处理 返回ip输入函数2.如果不是环回地址 检查是不是广播或者多播地 ...
- 批量 ping 测试脚本
是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...
- 从C++实现Ping开始说起
在C++中实现ping功能,并不难.但真正了解ping是需要花费一番功夫的. Ping功能是在ICMP基础上实现的.IP协议并不是一个可靠的协议,它不保证数据被送达,那么,保证数据送达的工作应该由其他 ...
- cnentos中进行bond网卡配置,一切配置无问题,就是ping不通宿主机
服务器网口绑定 1. ifcfg-bond0 DEVICE=bond0 ONBOOT=yes IPADDR=192.168.100.64 NETMASK=255.255.255.0 2. ...
随机推荐
- IOS如何打越狱包xcode无证书打包ios应用
本文要介绍的是在无证书的情况下如何将自己应用打包出去在越狱设备上使用或发给第三方使用企业签名进行应用分发. 前提条件:拥有appleId账号,并且该账号已经注册开发者中心(无需花钱) 教程开始: 1. ...
- SpringMVC 的初始化参数绑定
初始化参数绑定:日期格式 一:首先我们先做一种日期格式的绑定,配置初始化参数绑定和自定义类型转换有着异曲同工之妙 配置步骤如下: 1.我们首先配置applicationContext.xml,进行扫描 ...
- kafka brokers配置参数详解
基本配置如下: -broker.id-log.dirs-zookeeper.connect Topic-level配置以及其默认值将在下面讨论. Property Default Descriptio ...
- Dictionary and KeyValuePair.
简单一句话: Dictionary 是 由 KeyValuePair结构 组成的集合 The Dictionary<TKey, TValue>.Enumerator.Current pro ...
- Struts2_HelloWorld1
打开 eclipse,新建 web 项目. 因为可能需要 jstl 表达式,所以添加 jstl需要的jar包. 下载链接:http://pan.baidu.com/s/1hr6mBI0 将jar拷贝至 ...
- check_mk检测插件编写
参考 Writing Checks (Introduction) Writing agent based checks The New Check API http://www2.steinkogle ...
- vos2009如何设置客户自助密码
1. VOS2009 账户管理——>网关管理——>密码:就是客户的自助登陆密码 2. VOS3000 Vos3000里配置密码和自助密码分开 3. 登陆测试 浏览器输入http:// ...
- Sublime Text3 + Markdown + 实时预览
Sublime Text3是一款给力的文本编辑器,通过安装插件可以编辑Markdown文本,在编辑Markdown文本的同时可以实时预览编辑效果. 安装准备: 找到菜单栏:Preferences → ...
- Altium_Designer-各种布线总结
1.常规布线:不详细说了,是个人就知道怎么弄.需要说明的是在布线过程中,可按小键盘的*键或大键盘的数字2键添加一个过孔:按L键可以切换布线层:按数字3可设定最小线宽.典型线宽.最大线宽的值进行切换. ...
- 关于SAP UI5数据绑定我的一些原创内容
如何查找SAP UI5官方关于数据绑定的文档: https://sapui5.hana.ondemand.com/ 点Documentation: Filter里输入data就能看到Data Bind ...