1
1
use futures:: future:: join_all;
2
2
use indicatif:: ProgressBar ;
3
- use std:: io:: Write ;
3
+ use std:: io:: { BufRead , Write } ;
4
4
use std:: sync:: Arc ;
5
5
use surge_ping:: { Client , Config , IcmpPacket , PingIdentifier , PingSequence } ;
6
6
use tokio:: io:: AsyncWriteExt ;
7
7
mod utils;
8
8
use rand:: random;
9
9
use std:: time:: Duration ;
10
-
11
10
async fn perform_first_stage ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
12
11
let cloudflare_ipv4_addresses = utils:: get_all_ipv4 ( ) . await ?;
13
12
let mut tasks = Vec :: new ( ) ;
@@ -103,7 +102,7 @@ async fn perform_second_stage() -> Result<(), Box<dyn std::error::Error>> {
103
102
Ok ( ( IcmpPacket :: V6 ( _packet) , _duration) ) => { }
104
103
Err ( _) => {
105
104
let mut result_line = String :: from ( ipv4_address) ;
106
- result_line. push_str ( " timeout \n " ) ;
105
+ result_line. push_str ( " 999999 \n " ) ;
107
106
let mut file_handle = ping_result_file_clone. lock ( ) . await ;
108
107
file_handle. write ( result_line. as_bytes ( ) ) . unwrap ( ) ;
109
108
}
@@ -121,6 +120,31 @@ async fn perform_second_stage() -> Result<(), Box<dyn std::error::Error>> {
121
120
ping_result_file_lock. lock ( ) . await . sync_all ( ) . unwrap ( ) ;
122
121
return Ok ( ( ) ) ;
123
122
}
123
+ fn sort_ping_results ( ) -> std:: result:: Result < ( ) , Box < dyn std:: error:: Error > > {
124
+ let file = std:: fs:: File :: open ( "result/ping_ip.txt" ) ?;
125
+ let reader = std:: io:: BufReader :: new ( file) ;
126
+
127
+ let mut ping_results: Vec < ( String , u64 ) > = Vec :: new ( ) ;
128
+
129
+ for line in reader. lines ( ) {
130
+ let line = line?;
131
+ let parts: Vec < & str > = line. split_whitespace ( ) . collect ( ) ;
132
+ if parts. len ( ) == 2 {
133
+ let ip = parts[ 0 ] . to_owned ( ) ;
134
+ let ms = parts[ 1 ] . parse :: < u64 > ( ) . unwrap_or ( 0 ) ;
135
+ ping_results. push ( ( ip, ms) ) ;
136
+ }
137
+ }
138
+
139
+ ping_results. sort_by ( |a, b| a. 1 . cmp ( & b. 1 ) ) ;
140
+
141
+ let mut sorted_file = std:: fs:: File :: create ( "result/sorted_ping_ip.txt" ) ?;
142
+ for ( ip, ms) in ping_results {
143
+ writeln ! ( sorted_file, "{} {}" , ip, ms) ?;
144
+ }
145
+
146
+ Ok ( ( ) )
147
+ }
124
148
125
149
#[ tokio:: main]
126
150
async fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
@@ -129,5 +153,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
129
153
perform_first_stage ( ) . await ?;
130
154
println ! ( "Performing second stage" ) ;
131
155
perform_second_stage ( ) . await ?;
156
+ println ! ( "Sorting results" ) ;
157
+ sort_ping_results ( ) ?;
158
+ println ! ( "Done" ) ;
132
159
return Ok ( ( ) ) ;
133
160
}
0 commit comments