立即注册  找回密码
 立即注册
CeraNetworksBGVM服务器主机交流会员请立即修改密码Sharktech防护
查看: 80|回复: 9

写了个优选IP程序

[复制链接]

写了个优选IP程序

[复制链接]

6

主题

12

回帖

62

积分

注册会员

积分
62
niconiconi

6

主题

12

回帖

62

积分

注册会员

积分
62
2024-11-28 23:16:22 | 显示全部楼层 |阅读模式
本帖最后由 niconiconi 于 2024-11-28 23:20 编辑

写了个优选IP程序,实测50W个IP ping 4次取平均值,获取延迟最低前十只需要几秒钟,会动手的mjj自己编译,刚开始学有点糙

下载地址 https://drive.kamibook.com/raw/ipopt.7z

./ipopt.exe ipv4 ip.txt

ip.txt内容 示例 1.1.1.1/24  一行一个

[ol]
  • use std::{
  •     result,
  •     env,
  •     net::IpAddr,
  •     time::Duration,
  •     io::BufRead,
  •     collections::HashMap,
  • };
  • use futures::future::join_all;
  • use rand::random;
  • use surge_ping::{Client, Config, IcmpPacket, PingIdentifier, PingSequence, ICMP};
  • use tokio::time;
  • use ipnet::{Ipv4Net, Ipv6Net};
  • #[tokio::main]
  • async fn main() -> Result> {
  •     let args: Vec = env::args().collect();
  •     let ips = get_ip_from_file(&args[2]).await?;
  •     let ipaddrs = get_ip_range(&args[1], ips).await?;
  •     let client_v4 = Client::new(&Config::default())?;
  •     let client_v6 = Client::new(&Config::builder().kind(ICMP::V6).build())?;
  •     let mut tasks = Vec::new();
  •     for ip in &ipaddrs {
  •         match ip.parse() {
  •             Ok(IpAddr::V4(addr)) => {
  •                 tasks.push(tokio::spawn(ping(client_v4.clone(), IpAddr::V4(addr))))
  •             }
  •             Ok(IpAddr::V6(addr)) => {
  •                 tasks.push(tokio::spawn(ping(client_v6.clone(), IpAddr::V6(addr))))
  •             }
  •             Err(e) => println!("{} parse to ipaddr error: {}", ip, e),
  •         }
  •     }
  •     let results: Vec = join_all(tasks).await.into_iter().filter_map(Result::ok).collect();
  •     let mut ip_map = HashMap::new();
  •     for result in results {
  •         match result {
  •             Ok((ip, delay)) => {
  •                 ip_map.insert(ip, delay);
  •             }
  •             Err(e) => {
  •                 eprintln!("Error occurred: {:?}", e);
  •             }
  •         }
  •     }
  •     let top_10: Vec = ip_map.into_iter()
  •     .filter(|(_, delay)| delay.as_millis() > 0)
  •     .collect::>()
  •     .into_iter()
  •     .sorted_by(|(_, delay1), (_, delay2)| delay1.cmp(delay2))
  •     .take(10)
  •     .collect();
  •     for (ip, delay) in top_10 {
  •         println!("{} {:?}", ip, delay.as_millis());
  •     }
  •     Ok(())
  • }
  • async fn ping(client: Client, addr: IpAddr) -> Result> {
  •     let payload = [0; 56];
  •     let mut pinger = client.pinger(addr, PingIdentifier(random())).await;
  •     let mut interval = time::interval(Duration::from_secs(1));
  •     let mut delays = Vec::new();
  •     for idx in 0..4 {
  •         interval.tick().await;
  •         match pinger.ping(PingSequence(idx), &payload).await {
  •             Ok((IcmpPacket::V4(_packet), dur)) => {
  •                 delays.push(dur);
  •             }
  •             Ok((IcmpPacket::V6(_packet), dur)) => {
  •                 delays.push(dur);
  •             }
  •             Err(_e) => {
  •             }
  •         };
  •     }
  •     let average_delay = if !delays.is_empty() {
  •         let total: Duration = delays.iter().sum();
  •         total / delays.len() as u32
  •     } else {
  •         Duration::new(0, 0)
  •     };
  •     Ok((addr, average_delay))
  • }
  • async fn get_ip_from_file(file_path: &str) -> Result, Box> {
  •     let mut ips = Vec::new();
  •     let file = std::fs::File::open(file_path)?;
  •     let mut buf_reader = std::io::BufReader::new(file);
  •     let mut line = String::new();
  •    
  •     while buf_reader.read_line(&mut line).unwrap() > 0 {
  •         let ip = line.trim();
  •         ips.push(ip.to_string());
  •         line.clear();
  •     }
  •     Ok(ips)
  • }
  • async fn get_ip_range(ip_type: &str, ips: Vec) -> result::Result, Box> {
  •     let mut ip_subnets = Vec::new();
  •     match ip_type {
  •         "ipv4" => {
  •             for ip in ips {
  •                 let net: Ipv4Net = ip.parse().unwrap();
  •                 let subnets = net.subnets(32).expect("PrefixLenError: new prefix length cannot be shorter than existing");
  •                 for (_i, n) in subnets.enumerate() {
  •                     ip_subnets.push(n.to_string());
  •                 }
  •             }
  •         }
  •         "ipv6" => {
  •             for ip in ips {
  •                 let net: Ipv6Net = ip.parse().unwrap();
  •                 let subnets = net.subnets(128).expect("PrefixLenError: new prefix length cannot be shorter than existing");
  •                 for (_i, n) in subnets.enumerate() {
  •                     ip_subnets.push(n.to_string());
  •                 }
  •             }
  •         }
  •         _ => {
  •             return Err(Box::new(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Invalid IP type")));
  •         }
  •     }
  •     let ip_range: Vec =  ip_subnets.into_iter().map(|subnet: String| subnet.split('/').next().unwrap().to_string()).collect();
  •     Ok(ip_range)
  • }[/ol]复制代码
  • 回复

    使用道具 举报

    0

    主题

    181

    回帖

    494

    积分

    中级会员

    积分
    494
    网盘

    0

    主题

    181

    回帖

    494

    积分

    中级会员

    积分
    494
    2024-11-28 23:17:42 | 显示全部楼层
    大佬怎么用呢?  
    回复

    使用道具 举报

    40

    主题

    182

    回帖

    732

    积分

    高级会员

    积分
    732
    easonxnuw

    40

    主题

    182

    回帖

    732

    积分

    高级会员

    积分
    732
    2024-11-28 23:18:43 | 显示全部楼层
    不是有7Z吗 ,下载下来用啊
    回复

    使用道具 举报

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    niconiconi 楼主

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    2024-11-28 23:27:36 | 显示全部楼层
    由于多线程并发,会创建大量任务,这也是为什么在几秒钟内完成,所以cpu 内存会占用很大,50W占用内存800M
    回复

    使用道具 举报

    2

    主题

    50

    回帖

    222

    积分

    中级会员

    积分
    222
    skysf

    2

    主题

    50

    回帖

    222

    积分

    中级会员

    积分
    222
    2024-11-29 00:00:51 | 显示全部楼层
    loc还有会rust的,罕见

    回复

    使用道具 举报

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    niconiconi 楼主

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    2024-11-29 00:26:27 | 显示全部楼层
    "

    loc人才济济
    回复

    使用道具 举报

    25

    主题

    9035

    回帖

    1万

    积分

    论坛元老

    积分
    19655
    HOH

    25

    主题

    9035

    回帖

    1万

    积分

    论坛元老

    积分
    19655
    2024-11-29 00:00:00 | 显示全部楼层

    skysf 发表于 2024-11-29 00:00

    loc还有会rust的,罕见


    没什么罕见的,rust跟其他一样都是用库而已,你说看到.cpp .c那才叫罕见
    回复

    使用道具 举报

    2

    主题

    30

    回帖

    108

    积分

    注册会员

    积分
    108
    弟弟不爱吃饭

    2

    主题

    30

    回帖

    108

    积分

    注册会员

    积分
    108
    2024-11-29 00:30:03 | 显示全部楼层
    编译不通过
    回复

    使用道具 举报

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    niconiconi 楼主

    6

    主题

    12

    回帖

    62

    积分

    注册会员

    积分
    62
    2024-11-29 00:00:00 | 显示全部楼层
    "

    错误截图
    回复

    使用道具 举报

    92

    主题

    717

    回帖

    2856

    积分

    金牌会员

    积分
    2856
    虎谷

    92

    主题

    717

    回帖

    2856

    积分

    金牌会员

    积分
    2856
    2024-11-29 00:30:43 | 显示全部楼层
    loc果然高手如云啊
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|小黑屋|HS2V主机综合交流论坛

    GMT+8, 2024-12-23 10:52 , Processed in 0.025055 second(s), 3 queries , Gzip On, Redis On.

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表