🐞 fix: 修复网络上下行没有正确处理累计值的重置问题

This commit is contained in:
zhiyu1998 2024-11-22 21:03:59 +08:00
parent 5c382c8a24
commit a5028f9c71

View File

@ -5,6 +5,7 @@ import si from 'systeminformation';
let lastBytesReceived = 0; let lastBytesReceived = 0;
let lastBytesSent = 0; let lastBytesSent = 0;
let lastTimestamp = Date.now(); let lastTimestamp = Date.now();
let isFirstRun = true;
async function getLinuxStats() { async function getLinuxStats() {
const data = await fs.readFile('/proc/net/dev', 'utf8'); const data = await fs.readFile('/proc/net/dev', 'utf8');
@ -58,18 +59,33 @@ async function getNetworkStats() {
const now = Date.now(); const now = Date.now();
const timeDiff = (now - lastTimestamp) / 1000; const timeDiff = (now - lastTimestamp) / 1000;
const downloadSpeed = Math.max(0, (bytesReceived - lastBytesReceived) / timeDiff); let downloadSpeed = 0;
const uploadSpeed = Math.max(0, (bytesSent - lastBytesSent) / timeDiff); let uploadSpeed = 0;
if (!isFirstRun) {
// 检查是否发生了计数器重置或异常值
if (bytesReceived >= lastBytesReceived && bytesSent >= lastBytesSent) {
downloadSpeed = (bytesReceived - lastBytesReceived) / timeDiff;
uploadSpeed = (bytesSent - lastBytesSent) / timeDiff;
// 设置合理的上限值(比如 1GB/s
const MAX_SPEED = 1024 * 1024 * 1024; // 1 GB/s
downloadSpeed = Math.min(downloadSpeed, MAX_SPEED);
uploadSpeed = Math.min(uploadSpeed, MAX_SPEED);
}
}
// 更新状态
lastBytesReceived = bytesReceived; lastBytesReceived = bytesReceived;
lastBytesSent = bytesSent; lastBytesSent = bytesSent;
lastTimestamp = now; lastTimestamp = now;
isFirstRun = false;
return { return {
downloadSpeed: (downloadSpeed / 1024).toFixed(2), downloadSpeed: (downloadSpeed / 1024).toFixed(2), // KB/s
uploadSpeed: (uploadSpeed / 1024).toFixed(2), uploadSpeed: (uploadSpeed / 1024).toFixed(2), // KB/s
totalReceived: (bytesReceived / (1024 * 1024 * 1024)).toFixed(2), totalReceived: (bytesReceived / (1024 * 1024 * 1024)).toFixed(2), // GB
totalSent: (bytesSent / (1024 * 1024 * 1024)).toFixed(2), totalSent: (bytesSent / (1024 * 1024 * 1024)).toFixed(2), // GB
timestamp: now timestamp: now
}; };
} catch (error) { } catch (error) {