diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-09-14 22:42:08 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-09-14 22:42:08 +0800 |
| commit | bd923afe53de552c1f69e0db5a4490c73a294b91 (patch) | |
| tree | bddb85086caa22042281abaf6a73ad5e9bf71e8a /crates/utils/tcp_connection/src/target_connection.rs | |
| parent | 04253967b5926ff636e3148be62846874c3600aa (diff) | |
Add TcpServerConfigs
Diffstat (limited to 'crates/utils/tcp_connection/src/target_connection.rs')
| -rw-r--r-- | crates/utils/tcp_connection/src/target_connection.rs | 63 |
1 files changed, 63 insertions, 0 deletions
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<Client, Server> TcpServerTarget<Client, Server> +where + Client: ClientHandle<Server>, + Server: ServerHandle<Client>, +{ + 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(()) + } +} |
