当前位置: 首页 > news >正文

济南做网站要多少钱网站建设制作有那些

济南做网站要多少钱,网站建设制作有那些,网站开发人员的岗位有,电子商务网站业务流程分析0. 成品预览 本文将基于Rust构建一个常见的网络工具#xff0c;端口扫描器。 按照惯例#xff0c;还是和之前实现的文本编辑器一样#xff0c;我给这个工具起名为X-SCAN,它的功能很简单#xff0c;通过命令行参数的方式对指定IP进行扫描#xff0c;扫描结束之后返回该IP…0. 成品预览 本文将基于Rust构建一个常见的网络工具端口扫描器。 按照惯例还是和之前实现的文本编辑器一样我给这个工具起名为X-SCAN,它的功能很简单通过命令行参数的方式对指定IP进行扫描扫描结束之后返回该IP地址中处于开放状态的端口号,学完本文你将自己实现一个如下效果的端口扫描工具(截图以CSDN平台的IP地址的扫描结果为例) 1. 相关依赖 tokio {version 1.37.0,features [full]} bpaf {version 0.9.12,features [derive,bright-color]} ansi_term 0.12.1 prettytable-rs 0.10.0Tokio :用于异步编程bpaf 一个简化命令行实现的库ansi_term美化终端字符prettytable-rs将数据进行表格化打印 上面这些依赖都是在后续的代码中需要用到的后面会在针对每一个依赖库进行简单的入门讲解便于理解最终要实现的端口扫描工具。过多的还是建议去官方文档学习。 2. 基本实现原理 通过异步请求对目标IP的端口进行tcp链接扫描一旦连接建立成功将本次连接的端口号返回以此类推直到全部扫描结束,打印扫描的结果即可。 3. 几个依赖库的快速入门 这小节会对上面列出来的几个依赖库进行简单的入门为后续编码扫清障碍。 3.1 tokio Tokio官网 在tokio中实现异步编程的两大核心 asyncawait 如果某个函数需要异步执行可以通过async关键字实现比如下面connect函数的定义 use mini_redis::Result; use mini_redis::client::Client; use tokio::net::ToSocketAddrs;pub async fn connectT: ToSocketAddrs(addr: T) - ResultClient {// ... }这个异步函数的定义看起来像一个普通的同步函数但实际上是以异步方式运行的。这意味着在代码编写时异步函数的语法和结构与同步函数类似使得编写异步代码更加直观和易于理解。 Rust 编译器会对异步函数进行转换和优化以便在运行时能够以异步的方式执行。 当异步函数内部遇到 .await 关键字时它会暂时挂起当前操作将控制权交还给线程从而允许线程执行其他任务。 当异步操作在后台进行时线程并不会被阻塞而是可以继续执行其他任务从而提高程序的效率和并发性能。 async fn say_hi() {println!(Tokio); }#[tokio::main] async fn main() {let op say_hi();println!(hello);op.await; }使用#[tokio::main]宏将主函数标记为异步。 运行时包含异步任务调度器提供事件 I/O、计时器等。运行时不会自动启动因此需要 main 函数启动它。 对于异步函数它的调用方式和普通的Rust函数类似无需其他冗余操作当异步函数被调用时函数体不会立即执行而是会返回一个表示操作的值类似于返回一个尚未执行的操作描述标识这个概念类似于返回一个零参数的闭包闭包本身不会立即执行而是等待进一步的操作要执行异步函数代表的操作这就需要用到了另外一个关键字:await,它作用在操作返回值上用来触发异步操作 依据上面的描述示例代码会打印 hello Tokio 3.2 bpaf 这是一个多功能且易用的命令行参数解析工具。通过借助这个lib可以快速高效的编写命令行程序由于我们的端口扫描器需要手动通过命令行输入IP和端口范围等参数因此这无疑是一个不错的选择。 仓库地址 基本用法 // 导入 bpaf crate 中的 Bpaf trait use bpaf::Bpaf;// 定义一个结构体 SpeedAndDistance自动实现 Clone、Debug 和 Bpaf trait #[derive(Clone, Debug, Bpaf)] #[bpaf(options, version)] // 添加额外属性 options 和 version struct SpeedAndDistance {speed: f64, // 速度distance: f64, // 距离 }fn main() {// 解析命令行参数并返回选项let opts speed_and_distance().run();// 打印解析得到的选项信息println!(Options: {:?}, opts); }通过结构体的方式定义了两个属性分别是速度和距离由于我们需要将这两个字段作为命令行输入的参数因此这里使用了#[bpaf(options,version)] 示例代码中定义了两个参数在运行时通过下面的命令即可指定参数值执行程序 cargo run -- --speed 20.0 --distance 100.0需要注意的是这个crate有两种不同的用法过多内容请移步文档。 下面两个crate对本项目的实质性功能不会产生影响并且使用也相对简单这里就只做简单的介绍具体的示例就不再写了感兴趣的可以自己学习一下。 3.3 ansi_term 这个小工具用于美化字段字符的。虽然它的有无并不会影响我们项目的实际功能但是通过这个工具我们可以给自己的项目画一个有颜色的炫酷字符图案logo,这看起来是一件很酷的事情。 3.4 prettytable-rs 用于将输出构建成终端表格的形式进行打印并且可以指定表格颜色等信息。美化和规范输出。 4. 步入正题 开始正式编码之前先分析一下大致的实施步骤。 我们的X-SCAN大致可以分为三个小块。 命令行参数的定义解析负责解析命令行参数端口扫描的函数负责完成扫描的核心任务Rust主函数调用扫描函数并将结果组织返回 基于此这里将按照这个步骤依次展开讲解 4.1 参数定义 我们的X-SCAN一共需要三个参数,分别是 IP地址:Address起始端口号:start_port结束端口号:end_port // 命令行参数定义 #[derive(Debug, Clone, Bpaf)] #[bpaf(options)] pub struct Argument {#[bpaf(long, short, argument(Address), fallback(IPFALLBACK))]/// 想要嗅探的地址必须是有效的IPv4地址。将回退到127.0.0.1pub address: IpAddr,#[bpaf(long(start),short(s),guard(start_port_guard, 必须大于0),fallback(1u16))]pub start_port: u16,#[bpaf(long(end),short(e),guard(end_port_guard, 必须小于或等于65535),fallback(MAX))]pub end_port: u16, }这里主要用到了bpaf,这个上面讲过了但是这里有一些东西需要提一下这里用到了guard作为字段的条件约束指明该参数应该满足的规则它需要指定一个校验函数引入了long和short两个属性用来指定参数的长格式和短格式两种风格fallback用来指定参数默认值在用户没有显式指定参数时它的值将用作默认值 上面的代码中大概也注意到了在指定IP地址参数时我们用到了两个默认值的常量下面是他们的定义 const IPFALLBACK: IpAddr IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)); const MAX: u16 65535;常量 MAX 和 IPFALLBACK 这些是用作默认值的预定义值。 MAX 设置结束端口的最大值确保它不超过允许的最大端口号 (65535)。IPFALLBACK 提供默认 IP 地址127.0.0.1这是本地主机以防用户未指定 IP 地址。 4.2 扫描函数 这个scan 函数是一个异步函数旨在检查给定 IP 地址上的特定端口是否打开。 /// 异步函数扫描指定地址和端口 async fn scan(tx: Senderu16, start_port: u16, addr: IpAddr) {match TcpStream::connect(format!({}:{}, addr, start_port)).await {Ok(_) {print!(.);io::stdout().flush().unwrap();tx.send(start_port).unwrap();}Err(_) {}} }函数签名 async fn scan(tx: Senderu16, start_port: u16, addr: IpAddr) 这定义了一个名为 scan 的异步函数它采用三个参数 tx Senderu16 类型用于将数据在本例中为端口号发送到程序的另一部分。start_port 要检查的端口号;addr 要检查端口的 IP 地址。 TcpStream::connect(format!({}:{}, addr, start_port)).await 此行尝试建立到指定 addr 和 start_port 的 TCP 连接。使用 await 关键字是因为 TcpStream::connect 是一个异步操作您需要等待它完成才能继续,这一点之前也说过了使用match表达式来处理返回的不同结果具体如下 Ok(_)连接成功捕获一个开放端口 print!(.)这里用来在扫描过程中打印...作为正在扫描的视觉提示io::stdout().flush().unwrap():通过刷新标准输出缓冲区确保点立即显示在屏幕上,达到实时加载的视觉效果tx.send(start_port).unwrap():通过 tx 通道返回开放端口号以由程序的其他部分处理或记录。 Err(_):连接失败表示本次连接的端口为关闭状态不做任何操作 利用异步编程有效地处理可能长时间运行的网络操作而不会阻止程序其他部分的执行。允许同时扫描多个端口从而加快扫描过程。 4.3 结果处理 main 函数设置异步环境、收集参数并生成用于扫描指定范围内的每个端口的任务。通过表格整理返回结果并打印 #[tokio::main] async fn main() {print_infos();let opts argument().run();let (tx, rx) channel();for i in opts.start_port..opts.end_port {let tx tx.clone();task::spawn(async move { scan(tx, i, opts.address).await });}let mut open_ports vec![];drop(tx);for p in rx {open_ports.push(p);}println!();open_ports.sort();let mut table Table::new();table.add_row(Row::new(vec![Cell::new(Port).style_spec(Fgblue),Cell::new(Status).style_spec(Fgblue),]));for port in open_ports {table.add_row(Row::new(vec![Cell::new(port.to_string()),Cell::new(is open),]));}table.printstd(); }#[tokio::main] 该属性宏将常规 main 函数转换为异步主函数。它设置 Tokio 运行时这是运行异步代码所必需的。let opts arguments().run(); 此行调用 arguments() 函数。该函数构造并解析命令行参数返回 Arguments 结构体存储在 opts 中。let (tx, rx) channel(); 这里创建了生产者、单消费者 通道。 tx 是发送者 rx 是接收者。该通道用于异步任务之间的通信。接着就是端口扫描的一个循环处理 第10行 为每个端口生成一个新的异步任务。使用当前端口号 i 、克隆的发送者 tx 和目标 IP 地址 opts.address 调用 scan 函数。每个任务将尝试连接到其分配的端口并通过通道将结果发送回。 drop(tx); 显式删除原始发件人。这很重要因为它标识将不再在此通道上发送消息从而允许接收者在处理所有发送的消息后退出循环。对于结果的处理这里创建了一个vec数组此循环从通道接收消息。每条消息代表一个开放端口号并将其存入vec之中对于23-27行,使用prettytable-rs提供的方法构建表格的表头包括端口Port和开放状态Status;29-36行则是将结果添加到表格中并打印在终端。 4.4 打印版本信息 对于图案信息大家可以去这个网站生成之后复制过来.https://patorjk.com/software/taag/ 我们新增一个函数用来在重新启动时打印X-SCAN的字符LOGO和版本等信息 fn print_infos() {println!({},Red.paint(r#__ __ _____ _____ _ _ \ \ / / / ____| / ____| /\ | \ | |\ V / ______ | (___ | | / \ | \| | |______| \___ \ | | / /\ \ | . |/ . \ ____) | | |____ / ____ \ | |\ |/_/ \_\ |_____/ \_____| /_/ \_\ |_| \_|author:代号0408version:0.1.0 #)); }别忘了在main函数中调用 5. 使用方式 cargo run -- --address 8.137.10.104 --start 1 --end 8888address参数指定要扫描的IP地址start 参数指定起始端口end参数指定结束端口 当然你也可以对参数使用短格式来执行程序 cargo run -- --address 49.232.219.30 -s 1 -e 10000注意使用参数的短格式形式时参数前面的短横线也需要调整为一条短横线(-)长格式参数使用两条(--) 假设我们不指定IP地址那么它将会默认扫描本地127.0.0.1; cargo run -- -s 1 -e 10000项目地址:https://github.com/08820048/X-SCAN 免责声明X-SCAN工具仅供合法授权的网络安全测试和评估使用作者不对任何非法或未经授权的使用行为承担责任。
http://www.zqtcl.cn/news/780861/

相关文章:

  • 如何制作网页的软件网站推广与搜索引擎优化
  • 四川内江网站建设太原网站建设网格未来
  • 陕西 网站建设 陕ICP创建商务站点的主要工作
  • 做照明出口的网站深圳 网站制作
  • 门户网站建设 简报嘉兴设计公司有哪些
  • 资阳房地产网站建设学校网站建设板块分析
  • 山东华邦建设网站首页wordpress h5自适应
  • 合肥市建设工程劳务分包合同备案表在哪个网站下载国际国内热点新闻事件
  • 临猗做网站怎么做挣钱的网站
  • 做软装找图片的网站wordpress 表单留言
  • 360网站挂马检测wordpress路径爆出
  • 有什么网站学做标书的专门做短视频的公司
  • 网站怎么做图片动态图片短视频推广
  • 海口的网站建设网页设计欣赏可爱风格
  • 高端网站设计哪个好五莲网站建设维护推广
  • 外贸网站 测速国内创意网页设计
  • 网站商城前台模板免费下载自己做网站统计
  • 十大免费货源网站免费版本厦门建网站多少钱
  • 网站建设投标书范本深圳网页设计培训多少钱
  • 动态ip可以做网站北京万户网络
  • 网址大全免费网站中国建设银行驻莫斯科网站
  • 网站建设 教材 推荐网站导入
  • 网站备案扫描智能软件开发就业前景
  • 快速网站建设费用口碑营销图片
  • wordpress地址和站点地址错天津seo诊断
  • 张云网站建设做谷歌推广比较好的公司
  • 电子商务网站建设与管理的论文题目智能自助建站系统源码
  • 个人网站建设价格网站做视频转流量
  • 点网站出图片怎么做深圳市中心在哪
  • 企业网站建设58同城网站优化排名软件哪些最好