PHP如何通过ICMP协议构建原始套接字实现ping功能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1218个文字,预计阅读时间需要5分钟。
推荐学习:PHP视频教程- PHP通过ICMP协议实现ping(原始套接字)- 最近想实现一个检测目标主机是否在线的功能,用百度查了查,大多是使用打开到某个端口的连接来判断目标主机是否在线。
推荐学习:《PHP视频教程》
PHP通过ICMP协议实现ping(原始套接字)
最近想实现一个检测目标主机是否在线的功能,用百度查了查,多是使用打开到某个端口的连接来判断目标主机是否在线的。如Windows系统3389端口(RDP)和*nix系统的22端口(SSH)。
但这样会出现一个问题,目标主机如果没有开放这些端口,则会导致判断上的错误。某个端口不开放并不代表目标主机离线。
由于大多数设备都会回应ping,由此想到了使用ping来实现这个功能。再次查询百度,发现大多数教程都使用exec()函数调用系统ping命令来实现,这显然很不安全。
所以最终决定使用PHP提供的原始套接字,自己构建ICMP包来实现ping。
要构建一个ICMP包,首先我们要了解ICMP包的结构。
可以看到,一个标准的ICMP包由8位类型,8位代码,16位校验和,16位ID,16位序列号和数据组成。接下来,我们就通过PHP构建一个这样的数据包。
本文共计1218个文字,预计阅读时间需要5分钟。
推荐学习:PHP视频教程- PHP通过ICMP协议实现ping(原始套接字)- 最近想实现一个检测目标主机是否在线的功能,用百度查了查,大多是使用打开到某个端口的连接来判断目标主机是否在线。
推荐学习:《PHP视频教程》
PHP通过ICMP协议实现ping(原始套接字)
最近想实现一个检测目标主机是否在线的功能,用百度查了查,多是使用打开到某个端口的连接来判断目标主机是否在线的。如Windows系统3389端口(RDP)和*nix系统的22端口(SSH)。
但这样会出现一个问题,目标主机如果没有开放这些端口,则会导致判断上的错误。某个端口不开放并不代表目标主机离线。
由于大多数设备都会回应ping,由此想到了使用ping来实现这个功能。再次查询百度,发现大多数教程都使用exec()函数调用系统ping命令来实现,这显然很不安全。
所以最终决定使用PHP提供的原始套接字,自己构建ICMP包来实现ping。
要构建一个ICMP包,首先我们要了解ICMP包的结构。
可以看到,一个标准的ICMP包由8位类型,8位代码,16位校验和,16位ID,16位序列号和数据组成。接下来,我们就通过PHP构建一个这样的数据包。

