diff --git a/FastTunnel.Client/appsettings.json b/FastTunnel.Client/appsettings.json index 060f502..32d95fd 100644 --- a/FastTunnel.Client/appsettings.json +++ b/FastTunnel.Client/appsettings.json @@ -20,7 +20,7 @@ "LocalIp": "127.0.0.1", // 站点监听的端口号 - "LocalPort": 80, + "LocalPort": 8001, // 子域名, 访问本站点时的url为 http://{SubDomain}.{Domain}:{ProxyPort_HTTP}/ "SubDomain": "test" // test.test.cc diff --git a/FastTunnel.Core/AsyncListener.cs b/FastTunnel.Core/AsyncListener.cs index e81629c..f763473 100644 --- a/FastTunnel.Core/AsyncListener.cs +++ b/FastTunnel.Core/AsyncListener.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; +using System.Threading.Tasks; namespace FastTunnel.Core { @@ -15,10 +17,13 @@ namespace FastTunnel.Core public int Port { get; set; } - Action handler; + Action receiveClient; Socket listener; T _data; + // Thread signal. + public ManualResetEvent allDone = new ManualResetEvent(false); + public AsyncListener(string ip, int port, ILogger logerr, T data) { _logerr = logerr; @@ -37,36 +42,39 @@ namespace FastTunnel.Core { // example https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example // Bind the socket to the local endpoint and listen for incoming connections. - try - { - listener.Listen(100); + this.receiveClient = receiveClient; - while (true) + Task.Run(() => + { + try { - // Set the event to nonsignaled state. - //allDone.Reset(); + listener.Listen(100); - // Start an asynchronous socket to listen for connections. - Console.WriteLine("Waiting for a connection..."); - listener.BeginAccept( - new AsyncCallback(AcceptCallback), - listener); + while (true) + { + // Set the event to nonsignaled state. + allDone.Reset(); + + // Start an asynchronous socket to listen for connections. + Console.WriteLine("Waiting for a connection..."); + listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); + + // Wait until a connection is made before continuing. + allDone.WaitOne(); + } - // Wait until a connection is made before continuing. - //allDone.WaitOne(); } - - } - catch (Exception e) - { - Console.WriteLine(e.ToString()); - } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + }); } void AcceptCallback(IAsyncResult ar) { // Signal the main thread to continue. - //allDone.Set(); + allDone.Set(); // Get the socket that handles the client request. Socket listener = (Socket)ar.AsyncState; @@ -75,7 +83,10 @@ namespace FastTunnel.Core // Create the state object. StateObject state = new StateObject(); state.workSocket = handler; - handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); + + receiveClient.Invoke(handler, _data); + + //handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); } void ReadCallback(IAsyncResult ar) @@ -93,8 +104,7 @@ namespace FastTunnel.Core if (bytesRead > 0) { // There might be more data, so store the data received so far. - state.sb.Append(Encoding.ASCII.GetString( - state.buffer, 0, bytesRead)); + state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); // Check for end-of-file tag. If it is not there, read // more data. @@ -106,6 +116,7 @@ namespace FastTunnel.Core Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content); // Echo the data back to the client. + Send(handler, content); } else @@ -130,22 +141,33 @@ namespace FastTunnel.Core { try { - // Retrieve the socket from the state object. + // Retrieve the socket from the state object. Socket handler = (Socket)ar.AsyncState; - // Complete sending the data to the remote device. + // Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); Console.WriteLine("Sent {0} bytes to client.", bytesSent); - - handler.Shutdown(SocketShutdown.Both); - handler.Close(); - } catch (Exception e) { Console.WriteLine(e.ToString()); } } + + public void ShutdownAndClose() + { + try + { + listener.Shutdown(SocketShutdown.Both); + } + catch (Exception ex) + { + } + finally + { + listener.Close(); + } + } } public class StateObject diff --git a/FastTunnel.Core/Core/SuiDaoServer.cs b/FastTunnel.Core/Core/SuiDaoServer.cs index 6082f2d..8be4c57 100644 --- a/FastTunnel.Core/Core/SuiDaoServer.cs +++ b/FastTunnel.Core/Core/SuiDaoServer.cs @@ -51,14 +51,14 @@ namespace FastTunnel.Core.Core private void ListenFastTunnelClient() { - IListener listener = new Listener(_serverSettings.BindAddr, _serverSettings.BindPort, _logger, null); + IListener listener = new AsyncListener(_serverSettings.BindAddr, _serverSettings.BindPort, _logger, null); listener.Listen(ReceiveClient); _logger.LogDebug($"监听客户端 -> {_serverSettings.BindAddr}:{_serverSettings.BindPort}"); } private void ListenCustomer() { - var listener = new Listener(_serverSettings.BindAddr, _serverSettings.ProxyPort_HTTP, _logger, null); + var listener = new AsyncListener(_serverSettings.BindAddr, _serverSettings.ProxyPort_HTTP, _logger, null); listener.Listen(ReceiveCustomer); _logger.LogDebug($"监听HTTP -> {_serverSettings.BindAddr}:{_serverSettings.ProxyPort_HTTP}"); diff --git a/FastTunnel.Core/FastTunnel.Core.csproj b/FastTunnel.Core/FastTunnel.Core.csproj index 214c2aa..b8937ef 100644 --- a/FastTunnel.Core/FastTunnel.Core.csproj +++ b/FastTunnel.Core/FastTunnel.Core.csproj @@ -11,6 +11,8 @@ + + @@ -25,6 +27,7 @@ + diff --git a/FastTunnel.Core/Handlers/Server/LoginHandler.cs b/FastTunnel.Core/Handlers/Server/LoginHandler.cs index c5e0dc1..a81c156 100644 --- a/FastTunnel.Core/Handlers/Server/LoginHandler.cs +++ b/FastTunnel.Core/Handlers/Server/LoginHandler.cs @@ -91,9 +91,10 @@ namespace FastTunnel.Core.Handlers server.SSHList.Remove(item.RemotePort); } - var ls = new Listener("0.0.0.0", item.RemotePort, _logger, + var ls = new AsyncListener("0.0.0.0", item.RemotePort, _logger, new SSHHandlerArg { LocalClient = client, SSHConfig = item }); + ls.Listen((client, local) => { var msgid = Guid.NewGuid().ToString(); diff --git a/FastTunnel.Core/IListener.cs b/FastTunnel.Core/IListener.cs index bf3df92..36dbc3e 100644 --- a/FastTunnel.Core/IListener.cs +++ b/FastTunnel.Core/IListener.cs @@ -7,6 +7,12 @@ namespace FastTunnel.Core { public interface IListener { + string IP { get; set; } + + int Port { get; set; } + void Listen(Action receiveClient); + + void ShutdownAndClose(); } } diff --git a/FastTunnel.Core/Listener.cs b/FastTunnel.Core/Listener.cs deleted file mode 100644 index 612cb65..0000000 --- a/FastTunnel.Core/Listener.cs +++ /dev/null @@ -1,98 +0,0 @@ -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Sockets; -using System.Text; -using System.Threading; -using FastTunnel.Core.Extensions; - -namespace FastTunnel.Core -{ - [Obsolete("Replaced by AsyncListener")] - public class Listener : IListener - { - ILogger _logerr; - - public string IP { get; set; } - - public int Port { get; set; } - - Action handler; - Socket ls; - T _data; - - public Listener(string ip, int port, ILogger logerr, T data) - { - _logerr = logerr; - _data = data; - this.IP = ip; - this.Port = port; - - IPAddress ipa = IPAddress.Parse(IP); - IPEndPoint ipe = new IPEndPoint(ipa, Port); - - ls = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - ls.Bind(ipe); - } - - public void Listen(Action receiveClient) - { - this.handler = receiveClient; - ls.Listen(100); - ThreadPool.QueueUserWorkItem((state) => - { - var _socket = state as Socket; - - while (true) - { - try - { - var client = _socket.Accept(); - - string point = client.RemoteEndPoint.ToString(); - ThreadPool.QueueUserWorkItem(ReceiveCustomer, client); - } - catch (SocketException ex) - { - break; - } - catch (Exception ex) - { - _logerr.LogError(ex); - throw; - } - } - }, ls); - } - - private void ReceiveCustomer(object state) - { - var client = state as Socket; - try - { - handler.Invoke(client, _data); - } - catch (Exception ex) - { - _logerr.LogError(ex); - } - } - - public void ShutdownAndClose() - { - try - { - ls.Shutdown(SocketShutdown.Both); - } - catch (Exception) - { - } - finally - { - ls.Close(); - _logerr.LogDebug("Listener closed"); - } - } - } -} diff --git a/FastTunnel.Core/Models/SSHInfo.cs b/FastTunnel.Core/Models/SSHInfo.cs index 016604b..9b9388f 100644 --- a/FastTunnel.Core/Models/SSHInfo.cs +++ b/FastTunnel.Core/Models/SSHInfo.cs @@ -11,6 +11,6 @@ namespace FastTunnel.Core.Models public SSHConfig SSHConfig { get; set; } - public Listener Listener { get; set; } + public IListener Listener { get; set; } } }