<?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
}

最新文章

  1. 【Win10 应用开发】自适应Toast通知的XML文档结构
  2. 【Java】XML解析之JDOM
  3. 《JAVA与模式》之享元模式
  4. 《ASP.NET1200例》解决母版页报错“内容控件必须是内容页中的顶级控件,或是引用母版页的嵌套母版页。”
  5. iOS6:在你的企业系统中支持Passbook
  6. js正则表达式和replace
  7. 初见IOS的UI之:UI控件的属性frame bounds center 和transform
  8. Unity3D 之UGUI 滑动条(Slider)
  9. Vanya and Triangles 暴力枚举
  10. 改进我们的小游戏 - 零基础入门学习Python004
  11. jQuery时间日期插件laydate,兼容bootstrap
  12. 【烂笔头】git常用命令篇
  13. closures
  14. group by 拓展
  15. npm 走 privoxy 代理经常出现 shasum check failed 的解决办法
  16. Redis 简介(官方翻译)
  17. PHP内核-环境搭建(一)
  18. Java第三阶段学习(五、流的操作规律、Properties流、序列化流与反序列化流、打印流、commons-IO jar包)
  19. MVC LinqToSql Json DbComparisonExpression 需要具有可比较类型的参数。
  20. 基本项目框架搭建 sqlserver druid配置

热门文章

  1. 存储过程 返回值 procedure return values
  2. The seventeenth day
  3. Odoo (OpenERP/TinyERP)-10.0 (Debian 8)
  4. 由Asp.Net客户端控件生成的服务器端控件
  5. jstl Maven 依赖导致的 Jar 包冲突
  6. 自定义 sql Split函数 / 自定义mp_helptext查看存储
  7. 笨办法学Python(七)
  8. CRUD全栈式编程架构之更精简的设计
  9. Android(java)学习笔记69:短信发送器
  10. Poj (3239),m皇后问题