From 27832eaeb792a178cd7546af325179f331f35472 Mon Sep 17 00:00:00 2001 From: Aleksandr Krotov Date: Sun, 21 Apr 2024 16:14:04 +0300 Subject: [PATCH] Make tcp socket creation non blocking (#1509) --- .../shadowsocks-service/src/local/tun/tcp.rs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/shadowsocks-service/src/local/tun/tcp.rs b/crates/shadowsocks-service/src/local/tun/tcp.rs index 13ec5841..977f2952 100644 --- a/crates/shadowsocks-service/src/local/tun/tcp.rs +++ b/crates/shadowsocks-service/src/local/tun/tcp.rs @@ -1,5 +1,6 @@ use std::{ collections::HashMap, + future::Future, io::{self, ErrorKind}, mem, net::{IpAddr, SocketAddr}, @@ -113,12 +114,12 @@ impl Drop for TcpConnection { } impl TcpConnection { - async fn new( + fn new( socket: TcpSocket<'static>, socket_creation_tx: &mpsc::UnboundedSender, manager_notify: Arc, tcp_opts: &TcpSocketOpts, - ) -> TcpConnection { + ) -> impl Future { let send_buffer_size = tcp_opts.send_buffer_size.unwrap_or(DEFAULT_TCP_SEND_BUFFER_SIZE); let recv_buffer_size = tcp_opts.recv_buffer_size.unwrap_or(DEFAULT_TCP_RECV_BUFFER_SIZE); @@ -136,11 +137,13 @@ impl TcpConnection { socket, socket_created_tx: tx, }); - // waiting socket add to SocketSet - let _ = rx.await; - TcpConnection { - control, - manager_notify, + async move { + // waiting socket add to SocketSet + let _ = rx.await; + TcpConnection { + control, + manager_notify, + } } } } @@ -524,13 +527,13 @@ impl TcpTun { &self.manager_socket_creation_tx, self.manager_notify.clone(), &accept_opts.tcp, - ) - .await; + ); // establish a tunnel let context = self.context.clone(); let balancer = self.balancer.clone(); tokio::spawn(async move { + let connection = connection.await; if let Err(err) = handle_redir_client(context, balancer, connection, src_addr, dst_addr).await { error!("TCP tunnel failure, {} <-> {}, error: {}", src_addr, dst_addr, err); }