Skip to content

Commit

Permalink
sync
Browse files Browse the repository at this point in the history
  • Loading branch information
snltty committed Sep 27, 2024
1 parent 3815546 commit 40e8575
Show file tree
Hide file tree
Showing 43 changed files with 952 additions and 313 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
release_name: v1.4.4.${{ steps.date.outputs.today }}
draft: false
prerelease: false
body: 1. 增加流量统计(暂时显示服务端流量)
body: "1. 总览,和详细流量统计,一眼知道服务器流量花在哪里\r\n2. 优化信标。减少流量,没有操作时尽量不产生流量"
- name: upload-win-x86-oss
id: upload-win-x86-oss
uses: tvrcgo/[email protected]
Expand Down
45 changes: 45 additions & 0 deletions linker.libs/LastTicksManager.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using System;

namespace linker.libs
{
public sealed class LastTicksManager
{
private long ticks = Environment.TickCount64;

public void Update()
{
ticks = Environment.TickCount64;
}
public bool Less(long ms)
{
return Environment.TickCount64 - ticks <= ms;
}
public bool Greater(long ms)
{
return Environment.TickCount64 - ticks > ms;
}
public bool Equal(long ms)
{
return ticks == ms;
}
public bool NotEqual(long ms)
{
return ticks != ms;
}

public long Diff()
{
return Environment.TickCount64 - ticks;
}
public bool Timeout(long ms)
{
return ticks == 0 || Environment.TickCount64 - ticks > ms;
}
public void Clear()
{
ticks = 0;
}

}

}
5 changes: 3 additions & 2 deletions linker.tunnel/connection/ITunnelConnection.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Net;
using linker.libs;
using System.Net;

namespace linker.tunnel.connection
{
Expand Down Expand Up @@ -139,7 +140,7 @@ public interface ITunnelConnection
/// <summary>
/// 最后通信时间
/// </summary>
public long LastTicks { get; }
public LastTicksManager LastTicks { get; }

/// <summary>
/// 发送ping
Expand Down
18 changes: 9 additions & 9 deletions linker.tunnel/connection/TunnelConnectionMsQuic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ public TunnelConnectionMsQuic()

public byte BufferSize { get; init; } = 3;

public bool Connected => Stream != null && Stream.CanWrite && LastTicks > 0;
public bool Connected => Stream != null && Stream.CanWrite && LastTicks.NotEqual(0);
public int Delay { get; private set; }
public long SendBytes { get; private set; }
public long ReceiveBytes { get; private set; }

public long LastTicks { get; private set; } = Environment.TickCount64;
public LastTicksManager LastTicks { get; private set; } = new LastTicksManager();

[JsonIgnore]
public QuicStream Stream { get; init; }
Expand All @@ -56,7 +56,7 @@ public TunnelConnectionMsQuic()
private bool framing;
private ReceiveDataBuffer bufferCache = new ReceiveDataBuffer();

private long pingStart = Environment.TickCount64;
private LastTicksManager pingTicks = new();
private byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.ping");
private byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.pong");
private bool pong = true;
Expand Down Expand Up @@ -148,7 +148,7 @@ private async Task ReadPacket(Memory<byte> buffer)
private async Task CallbackPacket(Memory<byte> packet)
{
ReceiveBytes += packet.Length;
LastTicks = Environment.TickCount64;
LastTicks.Update();
if (packet.Length == pingBytes.Length && (packet.Span.SequenceEqual(pingBytes) || packet.Span.SequenceEqual(pongBytes)))
{
if (packet.Span.SequenceEqual(pingBytes))
Expand All @@ -157,7 +157,7 @@ private async Task CallbackPacket(Memory<byte> packet)
}
else if (packet.Span.SequenceEqual(pongBytes))
{
Delay = (int)(Environment.TickCount64 - pingStart);
Delay = (int)pingTicks.Diff();
pong = true;
}
}
Expand All @@ -179,9 +179,9 @@ private async Task ProcessHeart()
{
while (cancellationTokenSource.IsCancellationRequested == false)
{
if (Environment.TickCount64 - LastTicks > 3000)
if (LastTicks.Greater(3000))
{
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);
}
await Task.Delay(3000).ConfigureAwait(false);
Expand Down Expand Up @@ -223,7 +223,7 @@ public async Task SendPing()
{
if (pong == false) return;
pong = false;
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);
}
private SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1);
Expand Down Expand Up @@ -254,7 +254,7 @@ public async Task<bool> SendAsync(ReadOnlyMemory<byte> data)

public void Dispose()
{
LastTicks = 0;
LastTicks.Clear();

if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"tunnel connection writer offline {ToString()}");
Expand Down
18 changes: 9 additions & 9 deletions linker.tunnel/connection/TunnelConnectionTcp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ public TunnelConnectionTcp()
public IPEndPoint IPEndPoint { get; init; }
public bool SSL { get; init; }
public byte BufferSize { get; init; } = 3;
public bool Connected => Socket != null && LastTicks > 0 && Environment.TickCount64 - LastTicks < 15000;
public bool Connected => Socket != null && LastTicks.Timeout(15000) == false;
public int Delay { get; private set; }
public long SendBytes { get; private set; }
public long ReceiveBytes { get; private set; }

public long LastTicks { get; private set; } = Environment.TickCount64;
public LastTicksManager LastTicks { get; private set; } = new LastTicksManager();

[JsonIgnore]
public SslStream Stream { get; init; }
Expand All @@ -47,7 +47,7 @@ public TunnelConnectionTcp()
private bool framing;
private ReceiveDataBuffer bufferCache = new ReceiveDataBuffer();

private long pingStart = Environment.TickCount64;
private LastTicksManager pingTicks = new LastTicksManager();
private byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.ping");
private byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.pong");
private bool pong = true;
Expand Down Expand Up @@ -157,7 +157,7 @@ private async Task ReadPacket(Memory<byte> buffer)
private async Task CallbackPacket(Memory<byte> packet)
{
ReceiveBytes += packet.Length;
LastTicks = Environment.TickCount64;
LastTicks.Update();
if (packet.Length == pingBytes.Length)
{
if (packet.Span.SequenceEqual(pingBytes))
Expand All @@ -166,7 +166,7 @@ private async Task CallbackPacket(Memory<byte> packet)
}
else if (packet.Span.SequenceEqual(pongBytes))
{
Delay = (int)(Environment.TickCount64 - pingStart);
Delay = (int)pingTicks.Diff();
pong = true;
}
return;
Expand All @@ -192,9 +192,9 @@ private async Task ProcessHeart()
break;
}

if (Environment.TickCount64 - LastTicks > 3000)
if (LastTicks.Greater(3000))
{
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);

}
Expand Down Expand Up @@ -246,7 +246,7 @@ public async Task SendPing()
{
if (pong == false) return;
pong = false;
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);
}
public async Task<bool> SendAsync(ReadOnlyMemory<byte> data)
Expand Down Expand Up @@ -286,7 +286,7 @@ public async Task<bool> SendAsync(ReadOnlyMemory<byte> data)

public void Dispose()
{
LastTicks = 0;
LastTicks.Clear();
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"tunnel connection {this.GetHashCode()} writer offline {ToString()}");

Expand Down
18 changes: 9 additions & 9 deletions linker.tunnel/connection/TunnelConnectionUdp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ public TunnelConnectionUdp()
public bool SSL { get; init; }
public byte BufferSize { get; init; } = 3;

public bool Connected => UdpClient != null && LastTicks > 0 && Environment.TickCount64 - LastTicks < 15000;
public bool Connected => UdpClient != null && LastTicks.Timeout(15000) == false;
public int Delay { get; private set; }
public long SendBytes { get; private set; }
public long ReceiveBytes { get; private set; }
public long LastTicks { get; private set; } = Environment.TickCount64;
public LastTicksManager LastTicks { get; private set; } = new LastTicksManager();

public bool Receive { get; init; }

Expand All @@ -56,7 +56,7 @@ public Socket UdpClient
private CancellationTokenSource cancellationTokenSource;
private object userToken;

private long pingStart = Environment.TickCount64;
private LastTicksManager pingTicks = new LastTicksManager();
private byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.udp.ping");
private byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.udp.pong");
private byte[] finBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.udp.fing");
Expand Down Expand Up @@ -129,7 +129,7 @@ public async Task<bool> ProcessWrite(Memory<byte> packet)
private async Task CallbackPacket(Memory<byte> packet)
{
ReceiveBytes += packet.Length;
LastTicks = Environment.TickCount64;
LastTicks.Update();

Memory<byte> memory = packet.Slice(4);
if (memory.Length == pingBytes.Length && memory.Span.Slice(0, pingBytes.Length - 4).SequenceEqual(pingBytes.AsSpan(0, pingBytes.Length - 4)))
Expand All @@ -140,7 +140,7 @@ private async Task CallbackPacket(Memory<byte> packet)
}
else if (memory.Span.SequenceEqual(pongBytes))
{
Delay = (int)(Environment.TickCount64 - pingStart);
Delay = (int)pingTicks.Diff();
pong = true;
}
else if (memory.Span.SequenceEqual(finBytes))
Expand Down Expand Up @@ -178,9 +178,9 @@ private async Task ProcessHeart()
break;
}

if (Environment.TickCount64 - LastTicks > 3000)
if (LastTicks.Greater(3000))
{
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);
}
await Task.Delay(3000).ConfigureAwait(false);
Expand Down Expand Up @@ -218,7 +218,7 @@ public async Task SendPing()
{
if (pong == false) return;
pong = false;
pingStart = Environment.TickCount64;
pingTicks.Update();
await SendPingPong(pingBytes).ConfigureAwait(false);
}

Expand Down Expand Up @@ -258,7 +258,7 @@ public void Dispose()

SendPingPong(finBytes).ContinueWith((result) =>
{
LastTicks = 0;
LastTicks.Clear();
if (Receive == true)
UdpClient?.SafeClose();
uUdpClient = null;
Expand Down
5 changes: 2 additions & 3 deletions linker.tunnel/transport/TransportUdpPortMap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -351,8 +351,7 @@ private void CleanTask()
{
TimerHelper.SetInterval(() =>
{
long ticks = Environment.TickCount64;
var keys = connectionsDic.Where(c => (c.Value.Connection == null && ticks - c.Value.LastTicks > 5000) || (c.Value.Connection != null && c.Value.Connection.Connected == false)).Select(c => c.Key).ToList();
var keys = connectionsDic.Where(c => (c.Value.Connection == null && c.Value.LastTicks.Greater(5000)) || (c.Value.Connection != null && c.Value.Connection.Connected == false)).Select(c => c.Key).ToList();
foreach (var item in keys)
{
connectionsDic.TryRemove(item, out _);
Expand All @@ -370,7 +369,7 @@ public sealed class State

public sealed class ConnectionCacheInfo
{
public long LastTicks { get; set; } = Environment.TickCount64;
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
public TunnelConnectionUdp Connection { get; set; }
}

Expand Down
6 changes: 6 additions & 0 deletions linker.web/src/apis/flow.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,10 @@ import { sendWebsocketMsg } from './request'

export const getFlows = () => {
return sendWebsocketMsg('flowClient/GetFlows');
}
export const getMessengerFlows = () => {
return sendWebsocketMsg('flowClient/GetMessengerFlows');
}
export const getSForwardFlows = (data) => {
return sendWebsocketMsg('flowClient/GetSForwardFlows', data);
}
6 changes: 5 additions & 1 deletion linker.web/src/apis/tuntap.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ export const updateTuntap = (name) => {
}
export const refreshTuntap = () => {
return sendWebsocketMsg('tuntapclient/refresh');
}
}
export const subscribePing = () => {
return sendWebsocketMsg('tuntapclient/SubscribePing');
}

3 changes: 3 additions & 0 deletions linker.web/src/apis/updater.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,7 @@ export const confirmServer = (version) => {
}
export const exitServer = () => {
return sendWebsocketMsg('updaterclient/exitserver');
}
export const subscribeUpdater = () => {
return sendWebsocketMsg('updaterclient/Subscribe');
}
3 changes: 2 additions & 1 deletion linker.web/src/views/full/devices/List.vue
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export default {
handleTunnelConnections,clearConnectionsTimeout
} = provideConnections();
const {_getUpdater,clearUpdaterTimeout} = provideUpdater();
const {_getUpdater,_subscribeUpdater,clearUpdaterTimeout} = provideUpdater();
const {_getAccessInfo,clearAccessTimeout} = provideAccess();
Expand Down Expand Up @@ -158,6 +158,7 @@ export default {
_getSForwardInfo();
_getUpdater();
_subscribeUpdater();
_getAccessInfo();
Expand Down
15 changes: 7 additions & 8 deletions linker.web/src/views/full/devices/TuntapEdit.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,14 @@
<el-input v-model="state.ruleForm.IP" style="width:14rem" />
<span>/</span>
<el-input @change="handlePrefixLengthChange" v-model="state.ruleForm.PrefixLength" style="width:4rem" />
<span style="width: 3rem;"></span>
<span style="width: 2rem;"></span>
<el-checkbox v-model="state.ruleForm.ShowDelay" label="显示延迟" size="large" />
<el-popover
placement="top" title="提示" :width="400" trigger="hover"
content="在测试延迟时,如果未连接,将自动去打洞连接,当你有一百个设备时,每个设备都同时去与其它99台设备连接,这数据量不小,所以尽量不要个设备都勾选"
>
<el-checkbox v-model="state.ruleForm.AutoConnect" label="自动连接" size="large" />
<!-- <el-popover placement="top" title="提示" :width="400" trigger="hover" content="当有大量客户端使用中继是,广播会使用服务器更多流量" >
<template #reference>
<el-checkbox v-model="state.ruleForm.AutoConnect" label="自动连接?" size="large" />
<el-checkbox v-model="state.ruleForm.Multicast" label="启用广播" size="large" />
</template>
</el-popover>

</el-popover> -->
</el-form-item>
<el-form-item prop="upgrade" style="margin-bottom:0">
<el-checkbox v-model="state.ruleForm.Upgrade" label="我很懂,我要使用高级功能(点对网和网对网)" size="large" />
Expand Down Expand Up @@ -104,6 +101,7 @@ export default {
ShowDelay: tuntap.value.current.ShowDelay,
AutoConnect: tuntap.value.current.AutoConnect,
Upgrade: tuntap.value.current.Upgrade,
Multicast: tuntap.value.current.Multicast,
Forwards:tuntap.value.current.Forwards.length == 0 ? [
{ListenAddr:'0.0.0.0',ListenPort:0,ConnectAddr:'0.0.0.0',ConnectPort:0}
Expand Down Expand Up @@ -165,6 +163,7 @@ export default {
json.ShowDelay = state.ruleForm.ShowDelay;
json.AutoConnect = state.ruleForm.AutoConnect;
json.Upgrade = state.ruleForm.Upgrade;
json.Multicast = state.ruleForm.Multicast;
json.Forwards = state.ruleForm.Forwards;
json.Forwards.forEach(c=>{
c.ListenPort=+c.ListenPort;
Expand Down
Loading

0 comments on commit 40e8575

Please sign in to comment.