diff --git a/src/gateway.rs b/src/gateway.rs index 6e54b8b..54d6271 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -52,7 +52,7 @@ pub fn router() -> std::io::Result<()> { Ok(()) } -pub fn run() -> std::io::Result<()> { +pub fn run(current_ip: (u8, u8, u8, u8)) -> std::io::Result<()> { let listener = TcpListener::bind("0.0.0.0:7878")?; let mut connections: Vec<[u8; 6]> = Vec::new(); @@ -70,7 +70,14 @@ pub fn run() -> std::io::Result<()> { if let Some(con) = connections.last() { stream.write_all(con)?; } else { - let default_addr = [0, 0, 0, 0, 0x1E, 0xC7]; + let default_addr = [ + current_ip.0, + current_ip.1, + current_ip.2, + current_ip.3, + 0x1E, + 0xC7, + ]; stream.write_all(&default_addr)?; } diff --git a/src/main.rs b/src/main.rs index 3c75fab..1aef1e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,41 @@ -fn main() { - ghostnet_rs::gateway::run().unwrap(); +use std::{ + io::{Read, Write}, + net::TcpStream, +}; + +fn main() -> std::io::Result<()> { + let mut stream = TcpStream::connect("ipv4.icanhazip.com:80")?; + + // Send raw HTTP request + let request = "GET / HTTP/1.1\r\n\ + Host: ipv4.icanhazip.com\r\n\ + Connection: close\r\n\ + \r\n"; + stream.write_all(request.as_bytes())?; + + // Read full response + let mut response = String::new(); + stream.read_to_string(&mut response)?; + + // Extract body after headers + if let Some(pos) = response.find("\r\n\r\n") { + let body = response[pos + 4..].trim(); + + // Parse into tuple (u8, u8, u8, u8) + let octets: Vec = body + .split('.') + .filter_map(|s| s.parse::().ok()) + .collect(); + + if octets.len() == 4 { + let ip_tuple = (octets[0], octets[1], octets[2], octets[3]); + ghostnet_rs::gateway::run(ip_tuple)?; + } else { + eprintln!("Invalid IPv4 address format: {}", body); + } + } else { + eprintln!("Invalid HTTP response"); + } + + Ok(()) }