123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Net.NetworkInformation;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- namespace WpfApp1
- {
- /// <summary>
- /// MainWindow.xaml 的交互逻辑
- /// </summary>
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- TestAsync();
- }
- private async void TestAsync()
- {
- var label0 = (Label)FindName("Label0");
- var label1 = (Label)FindName("Label1");
- // 获取本机第一个 IPv4 地址
- var firstIPv4Address = NetworkInterface
- .GetAllNetworkInterfaces()
- .SelectMany(n => n.GetIPProperties().UnicastAddresses)
- .Where(a => a.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
- .Select(a => a.Address)
- .FirstOrDefault();
- label0.Content = "本机IP:"+ firstIPv4Address.ToString();
- var ips = GetIPv4AddressesInSameSubnet();
- var label2 = (Label)FindName("Label2");
- var httpClient = new HttpClient();
- httpClient.Timeout = TimeSpan.FromSeconds(3);
- foreach (var ip in ips)
- {
- try
- {
- var address = ip.ToString();
- label1.Content = "检测:" + address + " 中";
- var result = await httpClient.GetAsync($"http://{address}:8080/api/RtmpControl/StopRtmpPush");
- if (result != null && result.StatusCode == HttpStatusCode.OK)
- {
- label2.Content += " 、" + address;
- }
- }
- catch (Exception e)
- {
- continue;
- }
- }
-
- }
- // 获取同一网段的所有 IPv4 地址
- IPAddress[] GetIPv4AddressesInSameSubnet()
- {
- var addresses = new List<IPAddress>();
- // 获取本机第一个 IPv4 地址和子网掩码
- var networkInterface = NetworkInterface.GetAllNetworkInterfaces()
- .FirstOrDefault(n => n.OperationalStatus == OperationalStatus.Up && n.NetworkInterfaceType != NetworkInterfaceType.Loopback);
- if (networkInterface == null)
- {
- throw new Exception("未找到可用的网络接口。");
- }
- var ipProperties = networkInterface.GetIPProperties();
- var ipv4Address = ipProperties.UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)?.Address;
- var subnetMask = ipProperties.UnicastAddresses.FirstOrDefault(a => a.Address.AddressFamily == AddressFamily.InterNetwork)?.IPv4Mask;
- if (ipv4Address == null || subnetMask == null)
- {
- throw new Exception("未找到可用的 IPv4 地址或子网掩码。");
- }
- // 将 IPv4 地址和子网掩码转换为整数形式
- var ipv4AddressBytes = ipv4Address.GetAddressBytes();
- var subnetMaskBytes = subnetMask.GetAddressBytes();
- var networkAddressBytes = new byte[4];
- var broadcastAddressBytes = new byte[4];
- for (int i = 0; i < 4; i++)
- {
- networkAddressBytes[i] = (byte)(ipv4AddressBytes[i] & subnetMaskBytes[i]);
- broadcastAddressBytes[i] = (byte)(ipv4AddressBytes[i] | (subnetMaskBytes[i] ^ 255));
- }
- var networkAddress = new IPAddress(networkAddressBytes);
- var broadcastAddress = new IPAddress(broadcastAddressBytes);
- // 枚举同一网段的所有 IPv4 地址
- var currentAddress = networkAddress;
- while (!currentAddress.Equals(broadcastAddress))
- {
- addresses.Add(currentAddress);
- var nextAddressBytes = currentAddress.GetAddressBytes();
- for (int i = 3; i >= 0; i--)
- {
- if (nextAddressBytes[i] == 255)
- {
- nextAddressBytes[i] = 0;
- }
- else
- {
- nextAddressBytes[i]++;
- break;
- }
- }
- currentAddress = new IPAddress(nextAddressBytes);
- }
- return addresses.ToArray();
- }
- }
- }
|