PingerHelper.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.NetworkInformation;
  6. using System.Net.Sockets;
  7. namespace Optimizer {
  8. internal static class PingerHelper {
  9. internal static string[] DNSOptions =
  10. {
  11. "Automatic",
  12. "Cloudflare",
  13. "OpenDNS",
  14. "Quad9",
  15. "Google",
  16. "AlternateDNS",
  17. "Adguard",
  18. "CleanBrowsing",
  19. "CleanBrowsing (adult filter)"
  20. };
  21. internal static string[] GoogleDNSv4 = { "8.8.8.8", "8.8.4.4" };
  22. internal static string[] GoogleDNSv6 = { "2001:4860:4860::8888", "2001:4860:4860::8844" };
  23. internal static string[] OpenDNSv4 = { "208.67.222.222", "208.67.220.220" };
  24. internal static string[] OpenDNSv6 = { "2620:0:ccc::2", "2620:0:ccd::2" };
  25. internal static string[] CloudflareDNSv4 = { "1.1.1.1", "1.0.0.1" };
  26. internal static string[] CloudflareDNSv6 = { "2606:4700:4700::1111", "2606:4700:4700::1001" };
  27. internal static string[] Quad9DNSv4 = { "9.9.9.9", "149.112.112.112" };
  28. internal static string[] Quad9DNSv6 = { "2620:fe::fe", string.Empty };
  29. internal static string[] CleanBrowsingDNSv4 = { "185.228.168.168", "185.228.168.169" };
  30. internal static string[] CleanBrowsingDNSv6 = { "2a0d:2a00:1::", "2a0d:2a00:2::" };
  31. internal static string[] CleanBrowsingAdultDNSv4 = { "185.228.168.10", "185.228.168.11" };
  32. internal static string[] CleanBrowsingAdultDNSv6 = { "2a0d:2a00:1::1", "2a0d:2a00:2::1" };
  33. internal static string[] AlternateDNSv4 = { "76.76.19.19", "76.223.122.150" };
  34. internal static string[] AlternateDNSv6 = { "2602:fcbc::ad", "2602:fcbc:2::ad" };
  35. internal static string[] AdguardDNSv4 = { "94.140.14.14", "94.140.15.15" };
  36. internal static string[] AdguardDNSv6 = { "2a10:50c0::ad1:ff", "2a10:50c0::ad2:ff" };
  37. internal static Ping pinger = new Ping();
  38. internal static bool ShowHiddenAdapters = false;
  39. internal static NetworkInterface[] NetworkAdapters = GetActiveNetworkAdapters();
  40. static IPAddress addressToPing;
  41. internal static NetworkInterface[] GetActiveNetworkAdapters() {
  42. try {
  43. if (ShowHiddenAdapters) NetworkAdapters = NetworkInterface.GetAllNetworkInterfaces();
  44. if (!ShowHiddenAdapters) NetworkAdapters = NetworkInterface.GetAllNetworkInterfaces().Where(
  45. a => a.OperationalStatus == OperationalStatus.Up &&
  46. (a.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || a.NetworkInterfaceType == NetworkInterfaceType.Ethernet) &&
  47. a.GetIPProperties().GatewayAddresses.Any(g => g.Address.AddressFamily.ToString() == "InterNetwork")).ToArray();
  48. }
  49. catch (Exception ex) {
  50. Logger.LogError("PingerHelper.GetActiveNetworkAdapters", ex.Message, ex.StackTrace);
  51. return null;
  52. }
  53. return NetworkAdapters;
  54. }
  55. internal static IEnumerable<string> GetDNSFromNetworkAdapter(NetworkInterface nic) {
  56. try {
  57. return nic.GetIPProperties().DnsAddresses.Select(z => z.ToString());
  58. }
  59. catch (Exception ex) {
  60. Logger.LogError("PingerHelper.GetDNSFromNetworkAdapter", ex.Message, ex.StackTrace);
  61. return null;
  62. }
  63. }
  64. internal static void SetDNS(string nic, string[] dnsv4, string[] dnsv6) {
  65. string cmdv4Alternate = string.Empty;
  66. string cmdv6Alternate = string.Empty;
  67. string cmdv4Primary = $"netsh interface ipv4 set dnsservers {nic} static {dnsv4[0]} primary";
  68. if (dnsv4.Length == 2) {
  69. cmdv4Alternate = $"netsh interface ipv4 add dnsservers {nic} {dnsv4[1]} index=2";
  70. }
  71. string cmdv6Primary = $"netsh interface ipv6 set dnsservers {nic} static {dnsv6[0]} primary";
  72. if (dnsv6.Length == 2) {
  73. cmdv6Alternate = $"netsh interface ipv6 add dnsservers {nic} {dnsv6[1]} index=2";
  74. }
  75. Utilities.RunCommand(cmdv4Primary);
  76. Utilities.RunCommand(cmdv4Alternate);
  77. Utilities.RunCommand(cmdv6Primary);
  78. Utilities.RunCommand(cmdv6Alternate);
  79. }
  80. internal static void ResetDefaultDNS(string nic) {
  81. string cmdv4 = $"netsh interface ipv4 set dnsservers {nic} dhcp";
  82. string cmdv6 = $"netsh interface ipv6 set dnsservers {nic} dhcp";
  83. Utilities.RunCommand(cmdv4);
  84. Utilities.RunCommand(cmdv6);
  85. }
  86. internal static void ResetDefaultDNSForAllNICs() {
  87. foreach (string nic in NetworkAdapters.Select(x => x.Name)) {
  88. ResetDefaultDNS(nic);
  89. }
  90. }
  91. internal static void SetDNSForAllNICs(string[] dnsv4, string[] dnsv6) {
  92. foreach (string nic in NetworkAdapters.Select(x => x.Name)) {
  93. SetDNS(nic, dnsv4, dnsv6);
  94. }
  95. }
  96. internal static PingReply PingHost(string nameOrAddress) {
  97. PingReply reply;
  98. try {
  99. addressToPing = Dns.GetHostAddresses(nameOrAddress).First(address => address.AddressFamily == AddressFamily.InterNetwork);
  100. reply = pinger.Send(addressToPing);
  101. return reply;
  102. }
  103. catch {
  104. return null;
  105. }
  106. }
  107. // It uses the InternalDNS setting for this
  108. internal static bool IsInternetAvailable() {
  109. const int timeout = 1000;
  110. string host = OptionsHelper.CurrentOptions.InternalDNS ?? Constants.INTERNAL_DNS;
  111. var ping = new Ping();
  112. var buffer = new byte[32];
  113. var pingOptions = new PingOptions();
  114. try {
  115. var reply = ping.Send(host, timeout, buffer, pingOptions);
  116. return (reply != null && reply.Status == IPStatus.Success);
  117. }
  118. catch (Exception) {
  119. return false;
  120. }
  121. }
  122. internal static void FlushDNSCache() {
  123. Utilities.RunCommand("ipconfig /flushdns");
  124. }
  125. //internal static string PortScan(string IP, int port)
  126. //{
  127. // IPAddress ipAddress = IPAddress.Parse(IP);
  128. // IPEndPoint endPoint = new IPEndPoint(ipAddress, port);
  129. // Socket sock = null;
  130. // try
  131. // {
  132. // sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  133. // IAsyncResult result = sock.BeginConnect(endPoint, null, null);
  134. // bool success = result.AsyncWaitHandle.WaitOne(100, true);
  135. // if (sock.Connected)
  136. // {
  137. // sock.EndConnect(result);
  138. // return $"{port} - [✓]";
  139. // }
  140. // else
  141. // {
  142. // return $"{port} - [×]";
  143. // }
  144. // }
  145. // catch
  146. // {
  147. // return $"{port} - [×]";
  148. // }
  149. // finally
  150. // {
  151. // if (sock != null) sock.Close();
  152. // }
  153. //}
  154. }
  155. }