diff --git a/FastTunnel.Core/Listener/ClientListenerV2.cs b/FastTunnel.Core/Listener/ClientListenerV2.cs index 8e9fbfd..eb917d1 100644 --- a/FastTunnel.Core/Listener/ClientListenerV2.cs +++ b/FastTunnel.Core/Listener/ClientListenerV2.cs @@ -76,32 +76,33 @@ namespace FastTunnel.Core.Listener return false; } - IClientMessageHandler handler = null; - switch (msg.MessageType) - { - case MessageType.C_LogIn: // 登录 - handler = _loginHandler; - break; - case MessageType.Heart: // 心跳 - handler = _heartHandler; - break; - case MessageType.C_SwapMsg: // 交换数据 - handler = _swapMsgHandler; - break; - default: - throw new Exception($"未知的通讯指令 {msg.MessageType}"); - } - try { + IClientMessageHandler handler = null; + switch (msg.MessageType) + { + case MessageType.C_LogIn: // 登录 + handler = _loginHandler; + break; + case MessageType.Heart: // 心跳 + handler = _heartHandler; + break; + case MessageType.C_SwapMsg: // 交换数据 + handler = _swapMsgHandler; + break; + default: + throw new Exception($"未知的通讯指令 {msg.MessageType}"); + } + handler.HandlerMsg(this._fastTunnelServer, token.Socket, msg); + + return handler.NeedRecive; } catch (Exception ex) { - _logger.LogError(ex, $"处理客户端消息失败:msg={msg.ToJson()}"); + _logger.LogError(ex, $"处理客户端消息失败 {words}"); + return false; } - - return handler.NeedRecive; } public void Stop() diff --git a/FastTunnel.Core/Sockets/SocketSwap.cs b/FastTunnel.Core/Sockets/SocketSwap.cs index 6dc2d85..7ff1911 100644 --- a/FastTunnel.Core/Sockets/SocketSwap.cs +++ b/FastTunnel.Core/Sockets/SocketSwap.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading; -using System.Threading.Tasks; namespace FastTunnel.Core.Sockets { @@ -29,6 +28,8 @@ namespace FastTunnel.Core.Sockets public SocketSwap(Socket sockt1, Socket sockt2, ILogger logger, string msgId) { + //sockt1.NoDelay = true; + //sockt2.NoDelay = true; m_sockt1 = sockt1; m_sockt2 = sockt2; m_msgId = msgId; @@ -37,13 +38,105 @@ namespace FastTunnel.Core.Sockets public void StartSwap() { - var st1 = new NetworkStream(m_sockt1, ownsSocket: true); - var st2 = new NetworkStream(m_sockt2, ownsSocket: true); + m_logger?.LogDebug($"[StartSwapStart] {m_msgId}"); + swapeStarted = true; - var taskX = st1.CopyToAsync(st2); - var taskY = st2.CopyToAsync(st1); + ThreadPool.QueueUserWorkItem(swapCallback, new Channel + { + Send = m_sockt1, + Receive = m_sockt2 + }); + + ThreadPool.QueueUserWorkItem(swapCallback, new Channel + { + Send = m_sockt2, + Receive = m_sockt1 + }); + + m_logger?.LogDebug($"[StartSwapEnd] {m_msgId}"); + } + + private void swapCallback(object state) + { + m_logger?.LogDebug($"swapCallback {m_msgId}"); + var chanel = state as Channel; + byte[] result = new byte[512]; + + while (true) + { + int num; + + try + { + try + { + num = chanel.Receive.Receive(result, 0, result.Length, SocketFlags.None); + } + catch (Exception) + { + closeSocket("Revice Fail"); + break; + } + + if (num == 0) + { + closeSocket("Normal Close"); + break; + } + + try + { + chanel.Send.Send(result, 0, num, SocketFlags.None); + } + catch (Exception) + { + closeSocket("Send Fail"); + break; + } + } + catch (Exception ex) + { + m_logger.LogCritical(ex, "致命异常"); + break; + } + } + + if (m_msgId.Contains("_")) + { + var interval = long.Parse(DateTime.Now.GetChinaTicks()) - long.Parse(m_msgId.Split('_')[0]); + m_logger?.LogDebug($"endSwap {m_msgId} 交互时常:{interval}ms"); + } + } + + private void closeSocket(string msg) + { + m_logger.LogDebug($"【closeSocket】:{msg}"); + + try + { + m_sockt1.Shutdown(SocketShutdown.Both); + } + catch (Exception) + { + } + finally + { + m_sockt1.Close(); + } + + try + { + m_sockt2.Shutdown(SocketShutdown.Both); + + } + catch (Exception) + { + } + finally + { + m_sockt2.Close(); + } - Task.WhenAny(taskX, taskY); } public ISocketSwap BeforeSwap(Action fun) diff --git a/publish-win.sh b/publish-win.sh new file mode 100644 index 0000000..a6450de --- /dev/null +++ b/publish-win.sh @@ -0,0 +1,20 @@ +#!/bin/bash +rm -rf publish/* +projects=("FastTunnel.Client" "FastTunnel.Server") +plates=("win-x64") +for project in ${projects[*]}; do + echo + echo "=========开始发布:${project} =========" + echo + for plate in ${plates[*]}; do + echo "plate=${plate}" + echo src/$project/$project.csproj + dotnet publish $project/$project.csproj -o=publish/$project.$plate -c=release #-p:PublishTrimmed=true --nologo + echo + echo "=========开始打包 =========" + echo + cd publish && tar -zcvf $project.$plate.tar.gz $project.$plate + cd ../ + # rm -rf publish/$project.$plate + done +done