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. ...
随机推荐
- [转]Linq语法二
本文将讲述LINQ的基础查询(此文所有例子都使用LINQ to Object) 在此之前,我们先创建一个用于示例的数据源: Student类:表示学生,包括学号.姓名及班级 Courses类:表示学生 ...
- extjs 6
因为最近公司要写一个项目前台所以开始学习extjs前端框架,希望一起共勉. 那么我们的教程就从 Hello World 讲起. helloWorld.js Ext.onReady(function ...
- 模拟Chrome皮肤
话不多说,先验货: (原始状态) (最大化状态) (对比图) 为自己鼓掌!!! 哈哈,捣鼓2天终于把这个搞出来了!虽然代码一团糟,但是不难理解! 要实现这个功能需要几个组件:DWM,GDI+ 在实现这 ...
- Android SQLite数据库之事务的学习
SQLite是Android系统内置的一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了.SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务. ...
- 我的Android开发之路——百度地图开源工具获取定位信息
定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...
- Struts2_用Action的属性接收参数
先在 Action 中定义要接收的属性,需要编写属性的getter 和 setter 方法 struts2 会自动帮我们把 String 类型的参数转为 Action 中相对应的数据类型. priva ...
- nginx启动时报错
nginx启动时报错 原因:nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed /var/cache/ngin ...
- 解析Excel文件 Apache POI框架使用
本文整理了,使用Apache POI 框架解析.读取Excel文件,过程中,程序代码出现的一些问题,并解决 1..xls 和 .xlsx 我们知道Excel文档,在Windows下,分为Excel20 ...
- webstrom使用
主题 主题下载:http://color-themes.com/?view=index&page=1&order=popular&search=&layout=HTML ...
- 腾讯云、CloudXNS域名服务器
腾讯云 f1g1ns1.dnspod.net f1g1ns2.dnspod.net CloudXNS lv3ns1.ffdns.net lv3ns2.ffdns.net lv3ns3.ffdns.ne ...