MainWindow.xaml.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Net.NetworkInformation;
  8. using System.Net.Sockets;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. using System.Windows.Data;
  14. using System.Windows.Documents;
  15. using System.Windows.Input;
  16. using System.Windows.Media;
  17. using System.Windows.Media.Imaging;
  18. using System.Windows.Navigation;
  19. using System.Windows.Shapes;
  20. namespace WpfApp1
  21. {
  22. /// <summary>
  23. /// MainWindow.xaml 的交互逻辑
  24. /// </summary>
  25. public partial class MainWindow : Window
  26. {
  27. public MainWindow()
  28. {
  29. InitializeComponent();
  30. }
  31. private void Button_Click(object sender, RoutedEventArgs e)
  32. {
  33. TestAsync();
  34. }
  35. private async void TestAsync()
  36. {
  37. var label0 = (Label)FindName("Label0");
  38. var label1 = (Label)FindName("Label1");
  39. // 获取本机第一个 IPv4 地址
  40. var firstIPv4Address = NetworkInterface
  41. .GetAllNetworkInterfaces()
  42. .SelectMany(n => n.GetIPProperties().UnicastAddresses)
  43. .Where(a => a.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  44. .Select(a => a.Address)
  45. .FirstOrDefault();
  46. label0.Content = "本机IP:"+ firstIPv4Address.ToString();
  47. var ips = GetIPv4AddressesInSameSubnet();
  48. var label2 = (Label)FindName("Label2");
  49. var httpClient = new HttpClient();
  50. httpClient.Timeout = TimeSpan.FromSeconds(3);
  51. foreach (var ip in ips)
  52. {
  53. try
  54. {
  55. var address = ip.ToString();
  56. label1.Content = "检测:" + address + " 中";
  57. var result = await httpClient.GetAsync($"http://{address}:8080/api/RtmpControl/StopRtmpPush");
  58. if (result != null && result.StatusCode == HttpStatusCode.OK)
  59. {
  60. label2.Content += " 、" + address;
  61. }
  62. }
  63. catch (Exception e)
  64. {
  65. continue;
  66. }
  67. }
  68. }
  69. // 获取同一网段的所有 IPv4 地址
  70. IPAddress[] GetIPv4AddressesInSameSubnet()
  71. {
  72. var addresses = new List<IPAddress>();
  73. // 获取本机第一个 IPv4 地址和子网掩码
  74. var networkInterface = NetworkInterface.GetAllNetworkInterfaces()
  75. .FirstOrDefault(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback);
  76. if (networkInterface == null)
  77. {
  78. throw new Exception("未找到可用的网络接口。");
  79. }
  80. var ipProperties = networkInterface.GetIPProperties();
  81. var ipv4Address = ipProperties.UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)?.Address;
  82. var subnetMask = ipProperties.UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)?.IPv4Mask;
  83. if (ipv4Address == null || subnetMask == null)
  84. {
  85. throw new Exception("未找到可用的 IPv4 地址或子网掩码。");
  86. }
  87. // 将 IPv4 地址和子网掩码转换为整数形式
  88. var ipv4AddressBytes = ipv4Address.GetAddressBytes();
  89. var subnetMaskBytes = subnetMask.GetAddressBytes();
  90. var networkAddressBytes = new byte[4];
  91. var broadcastAddressBytes = new byte[4];
  92. for (int i = 0; i < 4; i++)
  93. {
  94. networkAddressBytes[i] = (byte)(ipv4AddressBytes[i] & subnetMaskBytes[i]);
  95. broadcastAddressBytes[i] = (byte)(ipv4AddressBytes[i] | (subnetMaskBytes[i] ^ 255));
  96. }
  97. var networkAddress = new IPAddress(networkAddressBytes);
  98. var broadcastAddress = new IPAddress(broadcastAddressBytes);
  99. // 枚举同一网段的所有 IPv4 地址
  100. var currentAddress = networkAddress;
  101. while (!currentAddress.Equals(broadcastAddress))
  102. {
  103. addresses.Add(currentAddress);
  104. var nextAddressBytes = currentAddress.GetAddressBytes();
  105. for (int i = 3; i >= 0; i--)
  106. {
  107. if (nextAddressBytes[i] == 255)
  108. {
  109. nextAddressBytes[i] = 0;
  110. }
  111. else
  112. {
  113. nextAddressBytes[i]++;
  114. break;
  115. }
  116. }
  117. currentAddress = new IPAddress(nextAddressBytes);
  118. }
  119. return addresses.ToArray();
  120. }
  121. }
  122. }