From 6c692e79acbf19ce2b3d7e2a6a3b76c9629e26b1 Mon Sep 17 00:00:00 2001 From: SpringHgui <740360381@qq.com> Date: Thu, 26 Dec 2019 17:36:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=B8=AAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FastTunnel.Core/Server/SuiDaoServer.cs | 224 +++++++++++++------------ 1 file changed, 114 insertions(+), 110 deletions(-) diff --git a/FastTunnel.Core/Server/SuiDaoServer.cs b/FastTunnel.Core/Server/SuiDaoServer.cs index a65bb67..8255d79 100644 --- a/FastTunnel.Core/Server/SuiDaoServer.cs +++ b/FastTunnel.Core/Server/SuiDaoServer.cs @@ -144,127 +144,131 @@ namespace FastTunnel.Core.Server int length; - while (true) + try { - try + length = client.Receive(buffer); + } + catch (Exception ex) + { + _logger.Error(ex); + if (client.Connected) { - length = client.Receive(buffer); + client.Close(); } - catch (Exception ex) - { - _logger.Error(ex); - if (client.Connected) + return; + } + + // 将字节转换成字符串 + string words = Encoding.UTF8.GetString(buffer, 0, length); + var msg = JsonConvert.DeserializeObject>(words); + + _logger.Debug($"收到客户端指令:{msg.MessageType}"); + switch (msg.MessageType) + { + case MessageType.C_LogIn: + HandleTunnelClient(client, msg); + break; + case MessageType.Heart: + client.Send(new Message() { MessageType = MessageType.Heart, Content = null }); + break; + case MessageType.C_SwapMsg: + var msgId = (msg.Content as string); + NewRequest request; + + if (!string.IsNullOrEmpty(msgId) && newRequest.TryGetValue(msgId, out request)) { - client.Close(); + // Join + Task.Run(() => + { + (new SocketSwap(request.CustomerClient, client)) + .BeforeSwap(() => { if (request.Buffer != null) client.Send(request.Buffer); }) + .StartSwap(); + }); } - return; - } + else + { + // 未找到,关闭连接 + _logger.Error($"未找到请求:{msgId}"); + client.Send(new Message { MessageType = MessageType.Error, Content = $"未找到请求:{msgId}" }); + } + break; + case MessageType.S_NewCustomer: + default: + throw new Exception("参数异常"); + } + } - // 将字节转换成字符串 - string words = Encoding.UTF8.GetString(buffer, 0, length); - var msg = JsonConvert.DeserializeObject>(words); - - _logger.Debug($"收到客户端指令:{msg.MessageType}"); - switch (msg.MessageType) + private void HandleTunnelClient(Socket client, Message msg) + { + var requet = (msg.Content as JObject).ToObject(); + if (requet.ClientConfig.Webs != null && requet.ClientConfig.Webs.Count() > 0) + { + foreach (var item in requet.ClientConfig.Webs) { - case MessageType.C_LogIn: - var requet = (msg.Content as JObject).ToObject(); - if (requet.ClientConfig.Webs != null && requet.ClientConfig.Webs.Count() > 0) - { - foreach (var item in requet.ClientConfig.Webs) - { - var hostName = $"{item.SubDomain}.{serverSettings.Domain}".Trim(); - if (WebList.ContainsKey(hostName)) - { - _logger.Debug($"renew domain '{hostName}'"); + var hostName = $"{item.SubDomain}.{serverSettings.Domain}".Trim(); + if (WebList.ContainsKey(hostName)) + { + _logger.Debug($"renew domain '{hostName}'"); - WebList.Remove(hostName); - WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); - } - else - { - _logger.Debug($"new domain '{hostName}'"); - WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); - } + WebList.Remove(hostName); + WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); + } + else + { + _logger.Debug($"new domain '{hostName}'"); + WebList.Add(hostName, new WebInfo { Socket = client, WebConfig = item }); + } - client.Send(new Message { MessageType = MessageType.Info, Content = $"TunnelForWeb is OK: you can visit {item.LocalIp}:{item.LocalPort} from http://{hostName}:{serverSettings.ProxyPort_HTTP}" }); - } - } - - if (requet.ClientConfig.SSH != null && requet.ClientConfig.SSH.Count() > 0) - { - foreach (var item in requet.ClientConfig.SSH) - { - try - { - if (item.RemotePort.Equals(serverSettings.BindPort)) - { - _logger.Error($"RemotePort can not be same with BindPort: {item.RemotePort}"); - continue; - } - - if (item.RemotePort.Equals(serverSettings.ProxyPort_HTTP)) - { - _logger.Error($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}"); - continue; - } - - SSHInfo old; - if (SSHList.TryGetValue(item.RemotePort, out old)) - { - _logger.Debug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}"); - old.Listener.ShutdownAndClose(); - SSHList.Remove(item.RemotePort); - } - - var ls = new Listener("0.0.0.0", item.RemotePort, _logger, SSHHandler, new SSHHandlerArg { LocalClient = client, SSHConfig = item }); - ls.Listen(); - - // listen success - SSHList.Add(item.RemotePort, new SSHInfo { Listener = ls, Socket = client, SSHConfig = item }); - _logger.Debug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); - } - catch (Exception ex) - { - _logger.Error($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); - _logger.Error(ex); - client.Send(new Message { MessageType = MessageType.Error, Content = ex.Message }); - continue; - } - - client.Send(new Message { MessageType = MessageType.Info, Content = $"TunnelForSSH is OK: {requet.ClientConfig.Common.ServerAddr}:{item.RemotePort}->{item.LocalIp}:{item.LocalPort}" }); - } - } - break; - case MessageType.Heart: - client.Send(new Message() { MessageType = MessageType.Heart, Content = null }); - break; - case MessageType.C_SwapMsg: - var msgId = (msg.Content as string); - NewRequest request; - - if (!string.IsNullOrEmpty(msgId) && newRequest.TryGetValue(msgId, out request)) - { - // Join - Task.Run(() => - { - (new SocketSwap(request.CustomerClient, client)) - .BeforeSwap(() => { if (request.Buffer != null) client.Send(request.Buffer); }) - .StartSwap(); - }); - } - else - { - // 未找到,关闭连接 - _logger.Error($"未找到请求:{msgId}"); - client.Send(new Message { MessageType = MessageType.Error, Content = $"未找到请求:{msgId}" }); - } - break; - case MessageType.S_NewCustomer: - default: - throw new Exception("参数异常"); + client.Send(new Message { MessageType = MessageType.Info, Content = $"TunnelForWeb is OK: you can visit {item.LocalIp}:{item.LocalPort} from http://{hostName}:{serverSettings.ProxyPort_HTTP}" }); } } + + if (requet.ClientConfig.SSH != null && requet.ClientConfig.SSH.Count() > 0) + { + foreach (var item in requet.ClientConfig.SSH) + { + try + { + if (item.RemotePort.Equals(serverSettings.BindPort)) + { + _logger.Error($"RemotePort can not be same with BindPort: {item.RemotePort}"); + continue; + } + + if (item.RemotePort.Equals(serverSettings.ProxyPort_HTTP)) + { + _logger.Error($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}"); + continue; + } + + SSHInfo old; + if (SSHList.TryGetValue(item.RemotePort, out old)) + { + _logger.Debug($"Remove Listener {old.Listener.IP}:{old.Listener.Port}"); + old.Listener.ShutdownAndClose(); + SSHList.Remove(item.RemotePort); + } + + var ls = new Listener("0.0.0.0", item.RemotePort, _logger, SSHHandler, new SSHHandlerArg { LocalClient = client, SSHConfig = item }); + ls.Listen(); + + // listen success + SSHList.Add(item.RemotePort, new SSHInfo { Listener = ls, Socket = client, SSHConfig = item }); + _logger.Debug($"SSH proxy success: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); + } + catch (Exception ex) + { + _logger.Error($"SSH proxy error: {item.RemotePort} -> {item.LocalIp}:{item.LocalPort}"); + _logger.Error(ex); + client.Send(new Message { MessageType = MessageType.Error, Content = ex.Message }); + continue; + } + + client.Send(new Message { MessageType = MessageType.Info, Content = $"TunnelForSSH is OK: {requet.ClientConfig.Common.ServerAddr}:{item.RemotePort}->{item.LocalIp}:{item.LocalPort}" }); + } + } + + ReceiveClient(client, null); } private void SSHHandler(Socket client, SSHHandlerArg local)