From bd923afe53de552c1f69e0db5a4490c73a294b91 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 14 Sep 2025 22:42:08 +0800 Subject: Add TcpServerConfigs --- .../utils/tcp_connection/src/target_connection.rs | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 crates/utils/tcp_connection/src/target_connection.rs (limited to 'crates/utils/tcp_connection/src/target_connection.rs') diff --git a/crates/utils/tcp_connection/src/target_connection.rs b/crates/utils/tcp_connection/src/target_connection.rs new file mode 100644 index 0000000..1e25edd --- /dev/null +++ b/crates/utils/tcp_connection/src/target_connection.rs @@ -0,0 +1,63 @@ +use tokio::{net::TcpListener, spawn}; + +use crate::{ + error::TcpTargetError, + handle::{ClientHandle, ServerHandle}, + instance::ConnectionInstance, + target::TcpServerTarget, + target_configure::ServerTargetConfig, +}; + +impl TcpServerTarget +where + Client: ClientHandle, + Server: ServerHandle, +{ + pub async fn connect(&self) -> Result<(), TcpTargetError> { + Ok(()) + } + + pub async fn listen(&self) -> Result<(), TcpTargetError> { + let addr = self.get_addr(); + let listener = match TcpListener::bind(addr.clone()).await { + Ok(listener) => listener, + Err(_) => { + let err = format!("Bind to `{}` failed", addr); + return Err(TcpTargetError::from(err)); + } + }; + + let cfg: ServerTargetConfig = match self.get_server_cfg() { + Some(cfg) => cfg.clone(), + None => ServerTargetConfig::default(), + }; + + if cfg.is_once() { + let (stream, _) = match listener.accept().await { + Ok(result) => result, + Err(e) => { + let err = format!("Accept connection failed: {}", e); + return Err(TcpTargetError::from(err)); + } + }; + let instance = ConnectionInstance::from(stream); + Server::process(instance).await; + } else { + loop { + let (stream, _) = match listener.accept().await { + Ok(result) => result, + Err(e) => { + let err = format!("Accept connection failed: {}", e); + return Err(TcpTargetError::from(err)); + } + }; + let instance = ConnectionInstance::from(stream); + spawn(async move { + Server::process(instance).await; + }); + } + } + + Ok(()) + } +} -- cgit