PHP Socket编程 之 利用 fsockopen() 函数开放端口扫描器的实例
1、前言
本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。
2、关键技术
本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,则该端口处于开放状态,否则该端口处于关闭状态。
核心代码如下:
1 2 3 4 5 6 7 8 9 10 11 | foreach ( $port as $key => $value ) { echo '<tr>' ; echo '<td>' . $key . '</td>' ; echo '<td>' . $value . '</td>' ; echo '<td>' . $msg [ $key ] . '</td>' ; //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时 $fp = @ fsockopen ( $ip , $value , $errno , $errstr , 1); //如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@ $result = $fp ? '<span >开启</span>' : '<span >关闭</span>' ; echo '<td>' . $result . '</td>' ; echo '</tr>' ; } |
3、代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <title>端口扫描</title> <style type= "text/css" > td{ padding:10px; border-bottom:1px solid #eee; } </style> </head> <body> <form method= "post" action= '#' > 网址/ip:<input type= "text" name= "ip" value= "<?php echo $_POST['ip'] ?? '127.0.0.1'?>" > <button>扫描</button> </form> <table> <thead> <tr> <td>id</td> <td>端口号</td> <td>服务</td> <td>开启状态</td> </tr> </thead> <tbody> <?php $ip = $_POST [ 'ip' ] ?? '127.0.0.1' ; if ( ip2long ( $ip )){ $aIp = explode ( '.' , $ip ); //ip4地址使用.分隔符 //这里没有对 0.0.0.0 这种本机地址进行判断,只是粗略的判断ip是否合法 foreach ( $aIp as $key => $value ) { if ( $value < 0 || $value > 255){ die ( '地址不合法' ); } } } $port = array ( 21, 23, 25, 79, 80, 110, 135, 137, 138, 139, 143, 443, 445, 1433, 3306, 3389, ); $msg = array ( 'Ftp' , 'Telnet' , 'Smtp' , 'Finger' , 'Http' , 'Pop3' , 'Location Service' , 'Netbios-NS' , 'Netbios-DGM' , 'Netbios-SSN' , 'IMAP' , 'Https' , 'Microsoft-DS' , 'MSSQL' , 'MYSQL' , 'Terminal Services' ); //无论使用prot还是msg循环都是可以的,因为$key是对应的,都是索引数组 foreach ( $port as $key => $value ) { echo '<tr>' ; echo '<td>' . $key . '</td>' ; echo '<td>' . $value . '</td>' ; echo '<td>' . $msg [ $key ] . '</td>' ; //$errno 和 $errstr 在这里基本用不上,只是为了设置 timeout,防止请求超时 $fp = @ fsockopen ( $ip , $value , $errno , $errstr , 1); //如果主机(hostname)不可访问,将会抛出一个警告级别(E_WARNING)的错误提示。所有需要加@ $result = $fp ? '<span >开启</span>' : '<span >关闭</span>' ; echo '<td>' . $result . '</td>' ; echo '</tr>' ; } ?> </tbody> </table> </body> </html> |
4、主要函数介绍
4.1、fsockopen
根据一个主机名来创建一个连接,成功返回一个资源对象,失败返回false;主机不可用是抛出一个警告
详情参考:http://php.net/manual/en/function.fsockopen.php
分类:
PHP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具