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