Skip to main content

bedrock_probe/
bedrock_probe.rs

1use rust_raknet::{RaknetSocket, Reliability};
2use std::{env, time::Duration};
3#[tokio::main]
4async fn main() {
5    let args: Vec<_> = env::args().collect();
6    let address = args[1].parse().unwrap();
7    let version: u8 = args[2].parse().unwrap();
8    rust_raknet::enable_raknet_log(3);
9    println!("TARGET {address} RAKNET {version}");
10    let socket = match tokio::time::timeout(
11        Duration::from_secs(10),
12        RaknetSocket::connect_with_version(&address, version),
13    )
14    .await
15    {
16        Ok(Ok(socket)) => {
17            println!("HANDSHAKE OK");
18            socket
19        }
20        Ok(Err(error)) => {
21            println!("HANDSHAKE ERROR {error}");
22            std::process::exit(1);
23        }
24        Err(_) => {
25            println!("HANDSHAKE TIMEOUT");
26            std::process::exit(2);
27        }
28    };
29    if let Some(protocol) = args.get(3) {
30        let protocol: i32 = protocol.parse().unwrap();
31        let mut request = vec![0xfe, 6, 0xc1, 1];
32        request.extend_from_slice(&protocol.to_be_bytes());
33        socket
34            .send(&request, Reliability::ReliableOrdered)
35            .await
36            .unwrap();
37        println!("SENT RequestNetworkSettings protocol={protocol}");
38        match tokio::time::timeout(Duration::from_secs(5), socket.recv()).await {
39            Ok(Ok(data)) => {
40                println!(
41                    "RECEIVED {} bytes: {:02x?}",
42                    data.len(),
43                    &data[..data.len().min(80)]
44                );
45                if data.len() >= 8 && data[0] == 0xfe && data[2..4] == [0x8f, 1] {
46                    println!(
47                        "NETWORK_SETTINGS OK threshold={} algorithm={}",
48                        u16::from_le_bytes([data[4], data[5]]),
49                        u16::from_le_bytes([data[6], data[7]])
50                    );
51                } else {
52                    println!("UNEXPECTED APPLICATION RESPONSE");
53                    std::process::exit(3);
54                }
55            }
56            other => {
57                println!("APPLICATION RECEIVE ERROR {other:?}");
58                std::process::exit(4);
59            }
60        }
61    }
62    let _ = tokio::time::timeout(Duration::from_secs(1), socket.close()).await;
63}