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() { } } }