回滚swap

This commit is contained in:
SpringHgui 2021-07-30 21:27:54 +08:00
parent 9afb1a4bd4
commit 1d6501eae9
3 changed files with 139 additions and 25 deletions

View File

@ -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()

View File

@ -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)

20
publish-win.sh Normal file
View File

@ -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