mirror of
https://github.com/FastTunnel/FastTunnel.git
synced 2025-02-08 02:39:29 +08:00
回滚swap
This commit is contained in:
parent
9afb1a4bd4
commit
1d6501eae9
|
@ -76,32 +76,33 @@ namespace FastTunnel.Core.Listener
|
||||||
return false;
|
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
|
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);
|
handler.HandlerMsg(this._fastTunnelServer, token.Socket, msg);
|
||||||
|
|
||||||
|
return handler.NeedRecive;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, $"处理客户端消息失败:msg={msg.ToJson()}");
|
_logger.LogError(ex, $"处理客户端消息失败 {words}");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return handler.NeedRecive;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Stop()
|
public void Stop()
|
||||||
|
|
|
@ -7,7 +7,6 @@ using System.Diagnostics;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FastTunnel.Core.Sockets
|
namespace FastTunnel.Core.Sockets
|
||||||
{
|
{
|
||||||
|
@ -29,6 +28,8 @@ namespace FastTunnel.Core.Sockets
|
||||||
|
|
||||||
public SocketSwap(Socket sockt1, Socket sockt2, ILogger logger, string msgId)
|
public SocketSwap(Socket sockt1, Socket sockt2, ILogger logger, string msgId)
|
||||||
{
|
{
|
||||||
|
//sockt1.NoDelay = true;
|
||||||
|
//sockt2.NoDelay = true;
|
||||||
m_sockt1 = sockt1;
|
m_sockt1 = sockt1;
|
||||||
m_sockt2 = sockt2;
|
m_sockt2 = sockt2;
|
||||||
m_msgId = msgId;
|
m_msgId = msgId;
|
||||||
|
@ -37,13 +38,105 @@ namespace FastTunnel.Core.Sockets
|
||||||
|
|
||||||
public void StartSwap()
|
public void StartSwap()
|
||||||
{
|
{
|
||||||
var st1 = new NetworkStream(m_sockt1, ownsSocket: true);
|
m_logger?.LogDebug($"[StartSwapStart] {m_msgId}");
|
||||||
var st2 = new NetworkStream(m_sockt2, ownsSocket: true);
|
swapeStarted = true;
|
||||||
|
|
||||||
var taskX = st1.CopyToAsync(st2);
|
ThreadPool.QueueUserWorkItem(swapCallback, new Channel
|
||||||
var taskY = st2.CopyToAsync(st1);
|
{
|
||||||
|
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)
|
public ISocketSwap BeforeSwap(Action fun)
|
||||||
|
|
20
publish-win.sh
Normal file
20
publish-win.sh
Normal 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
|
Loading…
Reference in New Issue
Block a user