From 52365e7b08b6ed33b03a47006fb296f4da7afb93 Mon Sep 17 00:00:00 2001 From: scbj Date: Tue, 23 Sep 2025 10:40:28 +0200 Subject: [PATCH] (rust) get tcpstream peer address --- rust/src/main.rs | 71 ++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 48 deletions(-) diff --git a/rust/src/main.rs b/rust/src/main.rs index 43feab3..dfbd9dc 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -1,63 +1,38 @@ #![allow(dead_code, unused)] -use axum::{extract::{Extension, Json, Path}, routing::{get, post}, Router}; +use std::net::{IpAddr, SocketAddr, TcpStream}; + +use clap::Parser; use serde::{Deserialize, Serialize}; use serde_json::Value; -use tokio::{fs, net::TcpListener, sync::mpsc}; +use tokio::{fs, io::AsyncWriteExt, net::TcpListener, sync::mpsc}; -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct Status { - pub id: u64, - pub name: String, - pub data: Vec, +#[derive(Clone, Debug, Parser)] +pub struct Args { + #[arg(long, default_value_t = false)] + pub host: bool, + + #[arg(short, long)] + pub address: SocketAddr, } #[tokio::main] async fn main() -> anyhow::Result<()> { - let (log_sender, mut log_receiver): (mpsc::Sender, mpsc::Receiver) = mpsc::channel(4); - let listener: TcpListener = TcpListener::bind("127.0.0.1:8080").await?; - let service: Router = Router::new() - .route("/", get(|| async {"hier ist nichts"})) - .route("/status", get(get_status).post(create_status)) - .layer(Extension(log_sender)); + let args: Args = Parser::parse(); - tokio::spawn(log_task(log_receiver)); + if args.host { + let listener: TcpListener = TcpListener::bind(args.address).await?; - axum::serve(listener, service).await.unwrap(); + loop { + if let Ok((mut stream, _)) = listener.accept().await { + println!("local address = {}, peer address = {}", stream.local_addr()?, stream.peer_addr()?); + stream.shutdown(); + } + } + } else { + let mut stream: TcpStream = TcpStream::connect(args.address)?; + } Ok(()) } -async fn get_status(Extension(logger): Extension>) -> Json { - let input: String = match fs::read_to_string("./test_status.json").await { - Ok(value) => value, - Err(error) => { - _ = logger.send(format!("no file `test_status.json` found")).await; - return Json(format!("failed to read status: {}", error)); - } - }; - let mut status: Vec = match serde_json::from_str(&input) { - Ok(value) => value, - Err(error) => { - _ = logger.send(format!("can't parse file `test_status.json`")).await; - return Json(format!("failed to parse 'json' file: {}", error)); - } - }; - - Json(serde_json::to_string_pretty(&status).unwrap()) -} - -async fn create_status(Extension(logger): Extension>) -> Json { - _ = logger.send(format!("BLARGH?")).await; - - Json(format!("PATIENCE!")) -} - -async fn log_task(mut receiver: mpsc::Receiver) -> () { - while !receiver.is_closed() { - match receiver.recv().await { - Some(log) => println!("{log}"), - None => break, - } - } -}