bedrock_probe/
bedrock_probe.rs1use 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}