mirror of
https://github.com/snltty/linker.git
synced 2025-10-26 02:20:24 +08:00
流量统计
This commit is contained in:
2
.github/workflows/dotnet.yml
vendored
2
.github/workflows/dotnet.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
release_name: v1.4.5.${{ steps.date.outputs.today }}
|
release_name: v1.4.5.${{ steps.date.outputs.today }}
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
body: "1. 订阅消费,按需同步数据,减少流量消费\r\n2. 更详细的流量统计信息"
|
body: "1. 订阅消费,按需同步数据,减少流量消费\r\n2. 更详细的流量统计信息\r\n3. 修复路由表失效问题"
|
||||||
- name: upload-win-x86-oss
|
- name: upload-win-x86-oss
|
||||||
id: upload-win-x86-oss
|
id: upload-win-x86-oss
|
||||||
uses: tvrcgo/oss-action@v0.1.1
|
uses: tvrcgo/oss-action@v0.1.1
|
||||||
|
|||||||
@@ -6,37 +6,77 @@ namespace linker.libs
|
|||||||
{
|
{
|
||||||
private long ticks = Environment.TickCount64;
|
private long ticks = Environment.TickCount64;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前值
|
||||||
|
/// </summary>
|
||||||
public long Value => ticks;
|
public long Value => ticks;
|
||||||
|
|
||||||
public void Update()
|
|
||||||
{
|
/// <summary>
|
||||||
ticks = Environment.TickCount64;
|
/// 差小于等于
|
||||||
}
|
/// </summary>
|
||||||
public bool Less(long ms)
|
/// <param name="ms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool DiffLessEqual(long ms)
|
||||||
{
|
{
|
||||||
return Environment.TickCount64 - ticks <= ms;
|
return Environment.TickCount64 - ticks <= ms;
|
||||||
}
|
}
|
||||||
public bool Greater(long ms)
|
/// <summary>
|
||||||
|
/// 差大于
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool DiffGreater(long ms)
|
||||||
{
|
{
|
||||||
return Environment.TickCount64 - ticks > ms;
|
return Environment.TickCount64 - ticks > ms;
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 等于
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
public bool Equal(long ms)
|
public bool Equal(long ms)
|
||||||
{
|
{
|
||||||
return ticks == ms;
|
return ticks == ms;
|
||||||
}
|
}
|
||||||
public bool NotEqual(long ms)
|
|
||||||
{
|
|
||||||
return ticks != ms;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 差值
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
public long Diff()
|
public long Diff()
|
||||||
{
|
{
|
||||||
return Environment.TickCount64 - ticks;
|
return Environment.TickCount64 - ticks;
|
||||||
}
|
}
|
||||||
public bool Timeout(long ms)
|
/// <summary>
|
||||||
|
/// 超时
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool Expired(long ms)
|
||||||
{
|
{
|
||||||
return ticks == 0 || Environment.TickCount64 - ticks > ms;
|
return ticks == 0 || Environment.TickCount64 - ticks > ms;
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 不等于
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool HasValue()
|
||||||
|
{
|
||||||
|
return ticks != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 更新值
|
||||||
|
/// </summary>
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
ticks = Environment.TickCount64;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 清除值
|
||||||
|
/// </summary>
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
ticks = 0;
|
ticks = 0;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace linker.tunnel.connection
|
|||||||
|
|
||||||
public byte BufferSize { get; init; } = 3;
|
public byte BufferSize { get; init; } = 3;
|
||||||
|
|
||||||
public bool Connected => Stream != null && Stream.CanWrite && LastTicks.NotEqual(0);
|
public bool Connected => Stream != null && Stream.CanWrite && LastTicks.HasValue();
|
||||||
public int Delay { get; private set; }
|
public int Delay { get; private set; }
|
||||||
public long SendBytes { get; private set; }
|
public long SendBytes { get; private set; }
|
||||||
public long ReceiveBytes { get; private set; }
|
public long ReceiveBytes { get; private set; }
|
||||||
@@ -179,7 +179,7 @@ namespace linker.tunnel.connection
|
|||||||
{
|
{
|
||||||
while (cancellationTokenSource.IsCancellationRequested == false)
|
while (cancellationTokenSource.IsCancellationRequested == false)
|
||||||
{
|
{
|
||||||
if (LastTicks.Greater(3000))
|
if (LastTicks.DiffGreater(3000))
|
||||||
{
|
{
|
||||||
pingTicks.Update();
|
pingTicks.Update();
|
||||||
await SendPingPong(pingBytes).ConfigureAwait(false);
|
await SendPingPong(pingBytes).ConfigureAwait(false);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace linker.tunnel.connection
|
|||||||
public IPEndPoint IPEndPoint { get; init; }
|
public IPEndPoint IPEndPoint { get; init; }
|
||||||
public bool SSL { get; init; }
|
public bool SSL { get; init; }
|
||||||
public byte BufferSize { get; init; } = 3;
|
public byte BufferSize { get; init; } = 3;
|
||||||
public bool Connected => Socket != null && LastTicks.Timeout(15000) == false;
|
public bool Connected => Socket != null && LastTicks.Expired(15000) == false;
|
||||||
public int Delay { get; private set; }
|
public int Delay { get; private set; }
|
||||||
public long SendBytes { get; private set; }
|
public long SendBytes { get; private set; }
|
||||||
public long ReceiveBytes { get; private set; }
|
public long ReceiveBytes { get; private set; }
|
||||||
@@ -192,7 +192,7 @@ namespace linker.tunnel.connection
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LastTicks.Greater(3000))
|
if (LastTicks.DiffGreater(3000))
|
||||||
{
|
{
|
||||||
pingTicks.Update();
|
pingTicks.Update();
|
||||||
await SendPingPong(pingBytes).ConfigureAwait(false);
|
await SendPingPong(pingBytes).ConfigureAwait(false);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace linker.tunnel.connection
|
|||||||
public bool SSL { get; init; }
|
public bool SSL { get; init; }
|
||||||
public byte BufferSize { get; init; } = 3;
|
public byte BufferSize { get; init; } = 3;
|
||||||
|
|
||||||
public bool Connected => UdpClient != null && LastTicks.Timeout(15000) == false;
|
public bool Connected => UdpClient != null && LastTicks.Expired(15000) == false;
|
||||||
public int Delay { get; private set; }
|
public int Delay { get; private set; }
|
||||||
public long SendBytes { get; private set; }
|
public long SendBytes { get; private set; }
|
||||||
public long ReceiveBytes { get; private set; }
|
public long ReceiveBytes { get; private set; }
|
||||||
@@ -178,7 +178,7 @@ namespace linker.tunnel.connection
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LastTicks.Greater(3000))
|
if (LastTicks.DiffGreater(3000))
|
||||||
{
|
{
|
||||||
pingTicks.Update();
|
pingTicks.Update();
|
||||||
await SendPingPong(pingBytes).ConfigureAwait(false);
|
await SendPingPong(pingBytes).ConfigureAwait(false);
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ namespace linker.tunnel.transport
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
socket.SafeClose();
|
socket.SafeClose();
|
||||||
break;
|
break;
|
||||||
@@ -351,7 +351,7 @@ namespace linker.tunnel.transport
|
|||||||
{
|
{
|
||||||
TimerHelper.SetInterval(() =>
|
TimerHelper.SetInterval(() =>
|
||||||
{
|
{
|
||||||
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();
|
var keys = connectionsDic.Where(c => (c.Value.Connection == null && c.Value.LastTicks.DiffGreater(5000)) || (c.Value.Connection != null && c.Value.Connection.Connected == false)).Select(c => c.Key).ToList();
|
||||||
foreach (var item in keys)
|
foreach (var item in keys)
|
||||||
{
|
{
|
||||||
connectionsDic.TryRemove(item, out _);
|
connectionsDic.TryRemove(item, out _);
|
||||||
|
|||||||
@@ -20,7 +20,8 @@
|
|||||||
<Authors>snltty</Authors>
|
<Authors>snltty</Authors>
|
||||||
<Company>snltty</Company>
|
<Company>snltty</Company>
|
||||||
<Description>1. 订阅消费,按需同步数据,减少流量消费
|
<Description>1. 订阅消费,按需同步数据,减少流量消费
|
||||||
2. 更详细的流量统计信息</Description>
|
2. 更详细的流量统计信息
|
||||||
|
3. 修复路由表失效问题</Description>
|
||||||
<Copyright>snltty</Copyright>
|
<Copyright>snltty</Copyright>
|
||||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using linker.libs;
|
using MemoryPack;
|
||||||
using MemoryPack;
|
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace linker.plugins.flow
|
namespace linker.plugins.flow
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ namespace linker.plugins.forward.proxy
|
|||||||
public byte[] Buffer { get; set; }
|
public byte[] Buffer { get; set; }
|
||||||
|
|
||||||
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
||||||
public bool Timeout => LastTicks.Timeout(60 * 60 * 1000);
|
public bool Timeout => LastTicks.Expired(60 * 1000);
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
TargetSocket?.SafeClose();
|
TargetSocket?.SafeClose();
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ namespace linker.plugins.messenger
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Connected => SourceSocket != null && lastTicks.Timeout(15000) == false;
|
public override bool Connected => SourceSocket != null && lastTicks.Expired(15000) == false;
|
||||||
|
|
||||||
|
|
||||||
private IConnectionReceiveCallback callback;
|
private IConnectionReceiveCallback callback;
|
||||||
@@ -257,7 +257,7 @@ namespace linker.plugins.messenger
|
|||||||
private ReceiveDataBuffer bufferCache = new ReceiveDataBuffer();
|
private ReceiveDataBuffer bufferCache = new ReceiveDataBuffer();
|
||||||
|
|
||||||
private LastTicksManager lastTicks = new LastTicksManager();
|
private LastTicksManager lastTicks = new LastTicksManager();
|
||||||
private LastTicksManager pingTicks =new LastTicksManager();
|
private LastTicksManager pingTicks = new LastTicksManager();
|
||||||
private static byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.ping");
|
private static byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.ping");
|
||||||
private static byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.pong");
|
private static byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.pong");
|
||||||
private bool pong = true;
|
private bool pong = true;
|
||||||
@@ -384,9 +384,9 @@ namespace linker.plugins.messenger
|
|||||||
{
|
{
|
||||||
while (cancellationTokenSource.IsCancellationRequested == false)
|
while (cancellationTokenSource.IsCancellationRequested == false)
|
||||||
{
|
{
|
||||||
if (lastTicks.Greater(3000))
|
if (lastTicks.DiffGreater(3000))
|
||||||
{
|
{
|
||||||
pingTicks .Update();
|
pingTicks.Update();
|
||||||
await SendPingPong(pingBytes).ConfigureAwait(false);
|
await SendPingPong(pingBytes).ConfigureAwait(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace linker.plugins.relay
|
|||||||
{
|
{
|
||||||
TimerHelper.SetInterval(() =>
|
TimerHelper.SetInterval(() =>
|
||||||
{
|
{
|
||||||
if (lastTicksManager.Less(5000))
|
if (lastTicksManager.DiffLessEqual(5000))
|
||||||
{
|
{
|
||||||
foreach (var item in flows.Values)
|
foreach (var item in flows.Values)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace linker.plugins.sforward.proxy
|
|||||||
{
|
{
|
||||||
TimerHelper.SetInterval(() =>
|
TimerHelper.SetInterval(() =>
|
||||||
{
|
{
|
||||||
if (lastTicksManager.Less(5000))
|
if (lastTicksManager.DiffLessEqual(5000))
|
||||||
{
|
{
|
||||||
foreach (var item in flows.Values)
|
foreach (var item in flows.Values)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -292,7 +292,7 @@ namespace linker.plugins.sforward.proxy
|
|||||||
{
|
{
|
||||||
public IPEndPoint IPEndPoint { get; set; }
|
public IPEndPoint IPEndPoint { get; set; }
|
||||||
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
||||||
public bool Timeout => LastTicks.Greater(5 * 60 * 1000);
|
public bool Timeout => LastTicks.DiffGreater(5 * 60 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class UdpConnectedCache
|
public sealed class UdpConnectedCache
|
||||||
@@ -300,7 +300,7 @@ namespace linker.plugins.sforward.proxy
|
|||||||
public Socket SourceSocket { get; set; }
|
public Socket SourceSocket { get; set; }
|
||||||
public Socket TargetSocket { get; set; }
|
public Socket TargetSocket { get; set; }
|
||||||
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
public LastTicksManager LastTicks { get; set; } = new LastTicksManager();
|
||||||
public bool Timeout => LastTicks.Greater(5 * 60 * 1000);
|
public bool Timeout => LastTicks.DiffGreater(5 * 60 * 1000);
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using System.Buffers.Binary;
|
|||||||
using linker.plugins.client;
|
using linker.plugins.client;
|
||||||
using linker.plugins.tunnel;
|
using linker.plugins.tunnel;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
|
using linker.libs.extends;
|
||||||
|
|
||||||
namespace linker.plugins.tuntap
|
namespace linker.plugins.tuntap
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -446,7 +446,7 @@ namespace linker.plugins.tuntap
|
|||||||
|
|
||||||
return infos
|
return infos
|
||||||
//自己的ip不要
|
//自己的ip不要
|
||||||
.Where(c => c.IP.Equals(runningConfig.Data.Tuntap.IP) == false && c.LastTicks.Greater(0))
|
.Where(c => c.IP.Equals(runningConfig.Data.Tuntap.IP) == false && c.LastTicks.Value > 0)
|
||||||
.OrderByDescending(c => c.LastTicks.Value)
|
.OrderByDescending(c => c.LastTicks.Value)
|
||||||
.Select(c =>
|
.Select(c =>
|
||||||
{
|
{
|
||||||
@@ -539,7 +539,7 @@ namespace linker.plugins.tuntap
|
|||||||
{
|
{
|
||||||
TimerHelper.SetInterval(async () =>
|
TimerHelper.SetInterval(async () =>
|
||||||
{
|
{
|
||||||
if (lastTicksManager.Less(5000))
|
if (lastTicksManager.DiffLessEqual(5000))
|
||||||
{
|
{
|
||||||
await Ping();
|
await Ping();
|
||||||
}
|
}
|
||||||
@@ -547,7 +547,7 @@ namespace linker.plugins.tuntap
|
|||||||
}, 3000);
|
}, 3000);
|
||||||
TimerHelper.SetInterval(async () =>
|
TimerHelper.SetInterval(async () =>
|
||||||
{
|
{
|
||||||
if (lastTicksManager.Greater(15000))
|
if (lastTicksManager.DiffGreater(15000))
|
||||||
{
|
{
|
||||||
await Ping();
|
await Ping();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ namespace linker.plugins.updater
|
|||||||
}
|
}
|
||||||
|
|
||||||
//距离上次订阅超过一分钟,需要立即更新一次
|
//距离上次订阅超过一分钟,需要立即更新一次
|
||||||
bool needUpdate = lastTicksManager.Greater(60 * 1000);
|
bool needUpdate = lastTicksManager.DiffGreater(60 * 1000);
|
||||||
|
|
||||||
lastTicksManager.Update();
|
lastTicksManager.Update();
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ namespace linker.plugins.updater
|
|||||||
if (updateInfo.Updated)
|
if (updateInfo.Updated)
|
||||||
{
|
{
|
||||||
updateInfo.MachineId = fileConfig.Data.Client.Id;
|
updateInfo.MachineId = fileConfig.Data.Client.Id;
|
||||||
string[] machines = subscribes.Where(c => c.Value.Less(15000)).Select(c => c.Key).ToArray();
|
string[] machines = subscribes.Where(c => c.Value.DiffLessEqual(15000)).Select(c => c.Key).ToArray();
|
||||||
if (machines.Length > 0)
|
if (machines.Length > 0)
|
||||||
{
|
{
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
v1.4.5
|
v1.4.5
|
||||||
2024-09-28 13:31:54
|
2024-09-28 14:56:27
|
||||||
1. 订阅消费,按需同步数据,减少流量消费
|
1. 订阅消费,按需同步数据,减少流量消费
|
||||||
2. 更详细的流量统计信息
|
2. 更详细的流量统计信息
|
||||||
|
3. 修复路由表失效问题
|
||||||
Reference in New Issue
Block a user