From 6812fc363ba8cdf452327664cfae6c69cf82b980 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 14 Sep 2025 12:39:37 +0800 Subject: Update module `tcp_connection` 1. Add handle.rs 2. Completed target.rs --- crates/utils/tcp_connection/src/handle.rs | 12 ++++++ crates/utils/tcp_connection/src/lib.rs | 4 +- crates/utils/tcp_connection/src/target.rs | 64 +++++++++++++++++++++++++------ 3 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 crates/utils/tcp_connection/src/handle.rs (limited to 'crates/utils') diff --git a/crates/utils/tcp_connection/src/handle.rs b/crates/utils/tcp_connection/src/handle.rs new file mode 100644 index 0000000..de7815d --- /dev/null +++ b/crates/utils/tcp_connection/src/handle.rs @@ -0,0 +1,12 @@ +use tokio::net::TcpStream; + +pub trait ClientHandle { + + fn process(stream: TcpStream); +} + +pub trait ServerHandle { + + fn process(stream: TcpStream); +} + diff --git a/crates/utils/tcp_connection/src/lib.rs b/crates/utils/tcp_connection/src/lib.rs index b1321c2..4c72735 100644 --- a/crates/utils/tcp_connection/src/lib.rs +++ b/crates/utils/tcp_connection/src/lib.rs @@ -1,2 +1,4 @@ #[allow(dead_code)] -pub mod target; \ No newline at end of file +pub mod target; + +pub mod handle; \ No newline at end of file diff --git a/crates/utils/tcp_connection/src/target.rs b/crates/utils/tcp_connection/src/target.rs index eb12677..ec7b6af 100644 --- a/crates/utils/tcp_connection/src/target.rs +++ b/crates/utils/tcp_connection/src/target.rs @@ -1,9 +1,21 @@ +use std::fmt::{Display, Formatter}; use std::net::{AddrParseError, IpAddr, Ipv4Addr, SocketAddr}; use std::str::FromStr; use tokio::net::lookup_host; +use crate::handle::{ClientHandle, ServerHandle}; -#[derive(Debug, Clone, Copy, Eq, PartialEq)] -pub struct TcpServerTarget { +const DEFAULT_PORT: u16 = 8080; + +#[derive(Debug, Eq, PartialEq)] +pub struct TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { + + /// Client Handle + client_handle: Option, + + /// Server Handle + server_handle: Option, /// Server port port: u16, @@ -12,39 +24,67 @@ pub struct TcpServerTarget { bind_addr: IpAddr, } -impl Default for TcpServerTarget { +impl Default for TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { fn default() -> Self { Self { - port: 80, + client_handle: None, + server_handle: None, + port: DEFAULT_PORT, bind_addr: IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), } } } -impl From for TcpServerTarget { +impl From for TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { /// Convert SocketAddr to TcpServerTarget fn from(value: SocketAddr) -> Self { Self { port: value.port(), bind_addr: value.ip(), + .. Self::default() } } } -impl TcpServerTarget { +impl Into for TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { + + /// Convert TcpServerTarget to SocketAddr + fn into(self) -> SocketAddr { + SocketAddr::new(self.bind_addr, self.port) + } +} + +impl Display for TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}:{}", self.bind_addr, self.port) + } +} + +impl TcpServerTarget +where Client: ClientHandle, + Server: ServerHandle { /// Create target by address pub fn from_addr(addr: impl Into, port: impl Into) -> Self { Self { port: port.into(), bind_addr: addr.into(), + .. Self::default() } } /// Try to create target by string - pub fn from_str<'a>(addr_str: impl AsRef<&'a str>) -> Result { - let socket_addr = SocketAddr::from_str(addr_str.as_ref()); + pub fn from_str<'a>(addr_str: impl Into<&'a str>) -> Result { + let socket_addr = SocketAddr::from_str(addr_str.into()); match socket_addr { Ok(socket_addr) => { Ok(Self::from_addr(socket_addr.ip(), socket_addr.port())) @@ -56,7 +96,7 @@ impl TcpServerTarget { } /// Try to create target by domain name - pub async fn from_domain<'a>(domain: impl AsRef<&'a str>) -> Result { + pub async fn from_domain<'a>(domain: impl Into<&'a str>) -> Result { match domain_to_addr(domain).await { Ok(domain_addr) => Ok(Self::from(domain_addr)), Err(e) => Err(e), @@ -65,9 +105,9 @@ impl TcpServerTarget { } /// Parse Domain Name to IpAddr via DNS -async fn domain_to_addr<'a>(domain: impl AsRef<&'a str>) -> Result { - let domain = domain.as_ref(); - let default_port: u16 = 80; +async fn domain_to_addr<'a>(domain: impl Into<&'a str>) -> Result { + let domain = domain.into(); + let default_port: u16 = DEFAULT_PORT; if let Ok(socket_addr) = domain.parse::() { return Ok(match socket_addr.ip() { -- cgit