From 7e0de2c4e62e198c4763e7db8bdc40d920481605 Mon Sep 17 00:00:00 2001 From: lbl8603 <49143209+lbl8603@users.noreply.github.com> Date: Wed, 7 Aug 2024 23:14:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=BD=E7=95=A5=E7=BB=91=E5=AE=9A=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt-cli/src/main.rs | 1 + vnt/src/channel/mod.rs | 8 ++++++-- vnt/src/channel/socket/mod.rs | 4 +++- vnt/src/channel/tcp_channel.rs | 18 +++++++++++++----- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/vnt-cli/src/main.rs b/vnt-cli/src/main.rs index e8152f5..77809b9 100644 --- a/vnt-cli/src/main.rs +++ b/vnt-cli/src/main.rs @@ -41,6 +41,7 @@ fn main0(config: Config, _show_cmd: bool) { let vnt_util = match Vnt::new(config, callback::VntHandler {}) { Ok(vnt) => vnt, Err(e) => { + log::error!("vnt create error {:?}", e); println!("error: {:?}", e); std::process::exit(1); } diff --git a/vnt/src/channel/mod.rs b/vnt/src/channel/mod.rs index 6fec685..3c62424 100644 --- a/vnt/src/channel/mod.rs +++ b/vnt/src/channel/mod.rs @@ -262,9 +262,13 @@ pub(crate) fn init_context( let socket = socket2::Socket::new(socket2::Domain::IPV4, socket2::Type::STREAM, None)?; (socket, address) }; - socket.set_reuse_address(true)?; + socket + .set_reuse_address(true) + .context("set_reuse_address")?; #[cfg(unix)] - socket.set_reuse_port(true)?; + if let Err(e) = socket.set_reuse_port(true) { + log::warn!("set_reuse_port {:?}", e) + } if let Err(e) = socket.bind(&address.into()) { if ports[0] == 0 { //端口可能冲突,则使用任意端口 diff --git a/vnt/src/channel/socket/mod.rs b/vnt/src/channel/socket/mod.rs index 87abb14..dd854cd 100644 --- a/vnt/src/channel/socket/mod.rs +++ b/vnt/src/channel/socket/mod.rs @@ -63,7 +63,9 @@ pub fn create_tcp0( if bind_port != 0 { socket.set_reuse_address(true)?; #[cfg(unix)] - socket.set_reuse_port(true)?; + if let Err(e) = socket.set_reuse_port(true) { + log::warn!("set_reuse_port {:?}", e) + } if v4 { let addr: SocketAddr = format!("0.0.0.0:{}", bind_port).parse().unwrap(); socket.bind(&addr.into())?; diff --git a/vnt/src/channel/tcp_channel.rs b/vnt/src/channel/tcp_channel.rs index 2e8e163..4f6eb52 100644 --- a/vnt/src/channel/tcp_channel.rs +++ b/vnt/src/channel/tcp_channel.rs @@ -14,6 +14,7 @@ use tokio::sync::mpsc::{channel, Receiver}; use crate::channel::context::ChannelContext; use crate::channel::handler::RecvChannelHandler; use crate::channel::sender::PacketSender; +use crate::channel::socket::create_tcp0; use crate::channel::{ConnectProtocol, RouteKey, BUFFER_SIZE, TCP_MAX_PACKET_SIZE}; use crate::util::StopManager; @@ -99,11 +100,18 @@ async fn connect_tcp0( where H: RecvChannelHandler, { - let mut stream = tokio::time::timeout( - Duration::from_secs(3), - crate::channel::socket::connect_tcp(addr, bind_port, context.default_interface()), - ) - .await??; + let socket = if bind_port != 0 { + match create_tcp0(addr.is_ipv4(), bind_port, context.default_interface()) { + Ok(socket) => socket, + Err(e) => { + log::warn!("{:?}", e); + create_tcp0(addr.is_ipv4(), 0, context.default_interface())? + } + } + } else { + create_tcp0(addr.is_ipv4(), 0, context.default_interface())? + }; + let mut stream = tokio::time::timeout(Duration::from_secs(3), socket.connect(addr)).await??; tcp_write(&mut stream, &data).await?; tcp_stream_handle(stream, addr, recv_handler, context).await;