LumaTunnel
【WinUI】LumaTunnel 是一个面向个人多设备的 Windows 代理系统。客户端在本机提供 HTTP/HTTPS CONNECT 与 SOCKS5 TCP 代理,并通过一个受信任 TLS 证书保护的 WSS 会话,将多个 TCP 流复用到自建 Windows Server 节点。
关注
0
Fork
0
Star
0
using LumaTunnel.Client.Interface;
using XFEExtension.NetCore.WinUIHelper.Implements.Services;
namespace LumaTunnel.Client.Implements;
public sealed class TrafficMeterService : GlobalServiceBase, ITrafficMeter
{
private readonly Queue<TrafficSample> _history = new();
private long _lastUpload;
private long _lastDownload;
public TrafficSample Current { get; private set; } = new(DateTimeOffset.UtcNow, 0, 0);
public IReadOnlyList<TrafficSample> History { get { lock (_history) return _history.ToArray(); } }
public void Sample()
{
var connections = AppServices.ProxyEngine.Connections;
var upload = connections.Sum(static item => item.UploadBytes);
var download = connections.Sum(static item => item.DownloadBytes);
Current = new TrafficSample(
DateTimeOffset.UtcNow,
Math.Max(0, upload - Interlocked.Exchange(ref _lastUpload, upload)),
Math.Max(0, download - Interlocked.Exchange(ref _lastDownload, download)));
lock (_history)
{
_history.Enqueue(Current);
while (_history.Count > 60) _history.Dequeue();
}
}
}
using LumaTunnel.Client.Interface;
using XFEExtension.NetCore.WinUIHelper.Implements.Services;
namespace LumaTunnel.Client.Implements;
public sealed class TrafficMeterService : GlobalServiceBase, ITrafficMeter
{
private readonly Queue<TrafficSample> _history = new();
private long _lastUpload;
private long _lastDownload;
public TrafficSample Current { get; private set; } = new(DateTimeOffset.UtcNow, 0, 0);
public IReadOnlyList<TrafficSample> History { get { lock (_history) return _history.ToArray(); } }
public void Sample()
{
var connections = AppServices.ProxyEngine.Connections;
var upload = connections.Sum(static item => item.UploadBytes);
var download = connections.Sum(static item => item.DownloadBytes);
Current = new TrafficSample(
DateTimeOffset.UtcNow,
Math.Max(0, upload - Interlocked.Exchange(ref _lastUpload, upload)),
Math.Max(0, download - Interlocked.Exchange(ref _lastDownload, download)));
lock (_history)
{
_history.Enqueue(Current);
while (_history.Count > 60) _history.Dequeue();
}
}
}