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
{
///
/// MainWindow.xaml 的交互逻辑
///
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();
// 获取本机第一个 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();
}
}
}