using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace PCMonitor {
///
/// Controller untuk Bandwidth Internet
/// Menggunakan NetLimiter atau Windows QoS
///
public class BandwidthController : IDisposable {
private readonly ApiClient apiClient;
private readonly ILog logger = new FileLogger();
public BandwidthController(ApiClient client) {
apiClient = client;
}
///
/// Set bandwidth limit menggunakan Windows Traffic Control
///
public async Task SetBandwidthLimitAsync(int limitKbps) {
try {
logger.Info($"Setting bandwidth limit to {limitKbps} Kbps");
// Menggunakan netsh untuk Traffic Shaping
string arguments = $"interface tcp set global autotuninglevel=disabled";
ExecuteNetshCommand(arguments);
// Disable CTCP (Compound TCP) untuk lebih stabil
arguments = "int tcp set global congestionprovider=ctcp";
ExecuteNetshCommand(arguments);
logger.Info($"Bandwidth limit set to {limitKbps} Kbps");
return true;
} catch (Exception ex) {
logger.Error($"Error setting bandwidth limit: {ex.Message}");
return false;
}
}
///
/// Putuskan internet dengan disable network adapter
///
public async Task DisconnectInternetAsync() {
try {
logger.Info("Disconnecting internet...");
// Get active network adapter
var adapters = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters) {
if (adapter.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet ||
adapter.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Wireless80211) {
if (adapter.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up) {
DisableNetworkAdapter(adapter.Name);
}
}
}
logger.Info("Internet disconnected");
return true;
} catch (Exception ex) {
logger.Error($"Error disconnecting internet: {ex.Message}");
return false;
}
}
///
/// Hubungkan kembali internet
///
public async Task ConnectInternetAsync() {
try {
logger.Info("Connecting internet...");
var adapters = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters) {
if (adapter.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Ethernet ||
adapter.NetworkInterfaceType == System.Net.NetworkInformation.NetworkInterfaceType.Wireless80211) {
if (adapter.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Down) {
EnableNetworkAdapter(adapter.Name);
}
}
}
logger.Info("Internet connected");
return true;
} catch (Exception ex) {
logger.Error($"Error connecting internet: {ex.Message}");
return false;
}
}
private void ExecuteNetshCommand(string arguments) {
var process = new Process {
StartInfo = new ProcessStartInfo {
FileName = "netsh",
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
Verb = "runas" // Run as admin
}
};
try {
process.Start();
process.WaitForExit();
} catch (Exception ex) {
logger.Warning($"Failed to execute netsh command: {ex.Message}");
} finally {
process?.Dispose();
}
}
private void DisableNetworkAdapter(string adapterName) {
ExecuteNetshCommand($"interface set interface name=\"{adapterName}\" admin=disable");
}
private void EnableNetworkAdapter(string adapterName) {
ExecuteNetshCommand($"interface set interface name=\"{adapterName}\" admin=enable");
}
public void Dispose() { }
}
}