using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Team.FFFeederService.Models; using System.Net.Mail; using static System.Net.Mime.MediaTypeNames; using TouchSocket.Sockets; namespace Team.FFFeederService { public class FeederIPManage { UdpClient udpClient; public FeederIPManage() { udpClient = new UdpClient(); } /// /// 获取所有的Feeder /// /// public async Task> Scan() { return await Task.Run(() => { List feeders1 = new List(); try { var netList = GetAllNetworkInterface(); foreach (var item in netList) { Bind(item.IPv4Address.ToString()); var feeders = GetFeederList(item); foreach (var item1 in feeders) { feeders1.Add(item1); } } } catch (Exception) { } return feeders1; }); } public void Bind(string ip) { // 指定要绑定的本地地址和端口 IPAddress localIpAddress = IPAddress.Parse(ip); // 你想要使用的网口的IP地址 int localPort = 8000; // 你想要绑定的端口号 udpClient.Client.Close(); udpClient.Client.Dispose(); udpClient = new UdpClient(); udpClient.Client.Bind(new IPEndPoint(localIpAddress, localPort)); } /// /// 获取所有已连接网口的IP地址 /// /// public NetworkInterfaceInfo[] GetAllNetworkInterface() { List networks = new List(); // 获取计算机上所有的网络接口 NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); // 遍历每个网络接口,并获取其IP地址信息 foreach (NetworkInterface networkInterface in networkInterfaces) { // 排除回环接口和虚拟接口等 if (networkInterface.OperationalStatus == OperationalStatus.Up && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Tunnel && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Unknown) { // 获取该网络接口的IP属性集合 IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); // 遍历该网络接口的IP地址信息 foreach (UnicastIPAddressInformation ip1 in ipProperties.UnicastAddresses) { // 仅输出IPv4地址 if (ip1.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { // 输出IPv4地址信息 Console.WriteLine($"网口名称: {networkInterface.Name}"); Console.WriteLine($"IPv4地址: {ip1.Address.ToString()}"); Console.WriteLine($"子网掩码: {ip1.IPv4Mask}"); networks.Add(new NetworkInterfaceInfo { Name = networkInterface.Name, IPv4Address = ip1.Address, IPv4Mask = ip1.IPv4Mask }); } } } } return networks.ToArray(); } /// /// 搜寻Feeder /// /// /// public FeederNetworkInterfaceInfo[] GetFeederList(NetworkInterfaceInfo network) { List feeders = new List(); // 设置服务IP(这个IP地址是服务器的IP),设置端口号 IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234); //发送信息 byte[] data = new byte[1024]; string cmd = "{udpscan}"; data = Encoding.UTF8.GetBytes(cmd); udpClient.Send(data, data.Length, ip); udpClient.Client.ReceiveTimeout = 500; for (int i = 0; i < 10; i++) { try { var da = udpClient.Receive(ref ip); string config = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r'); Console.WriteLine(config); //{ FF0Ver2.6.5 / ip:192.168.31.200:5000 / sub:255.255.255.0 / gw:192.168.31.1 / mac:80:34:28:66:49:6a} var info1 = AnalysisIP(config); if (info1 != null) { info1.IsAccessible = AreFirstThreeOctetsEqual(IPAddress.Parse(info1.IP), network.IPv4Address); info1.Network = network; feeders.Add((FeederNetworkInterfaceInfo)info1); } ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234); } catch (Exception) { break; } } return feeders.ToArray(); } /// /// 解析Feeder的IP等信息 /// /// /// public FeederNetworkInterfaceInfo AnalysisIP(string input) { // 定义正则表达式模式 string pattern = @"{(?[^V]+)Ver(?[^\/]+)\/ip:(?[^:]+):(?\d+)\/sub:(?[^\/]+)\/gw:(?[^\/]+)\/mac:(?[^}]+)}"; // 进行正则匹配 Match match = Regex.Match(input, pattern); // 提取匹配的值 if (match.Success) { string FF380 = match.Groups["Name"].Value.Trim(); string version = match.Groups["Version"].Value.Trim(); ; // 提取版本号 string IP = match.Groups["IP"].Value.Trim(); string port = match.Groups["Port"].Value.Trim(); string subnet = match.Groups["Subnet"].Value.Trim(); string gateway = match.Groups["Gateway"].Value.Trim(); string MAC = match.Groups["MAC"].Value.Trim(); // 输出提取的值 Console.WriteLine($"Name: {FF380}"); Console.WriteLine($"Version: {version}"); Console.WriteLine($"IP: {IP}"); Console.WriteLine($"Port: {port}"); Console.WriteLine($"子网掩码: {subnet}"); Console.WriteLine($"网关: {gateway}"); Console.WriteLine($"MAC: {MAC}"); return new FeederNetworkInterfaceInfo { FeederType = FF380, Version = version, IP = IP, Port = int.Parse(port), Subnet = subnet, Gateway = gateway, MAC = MAC }; } else { Console.WriteLine("No match found."); return null; } } /// /// 重置Feeder /// /// /// /// public bool ResetFeeder(string FeederMAC, NetworkInterfaceInfo network = null) { try { if (network != null) { Bind(network.IPv4Address.ToString()); } // 设置服务IP(这个IP地址是服务器的IP),设置端口号 IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234); //发送信息 byte[] data = new byte[1024]; string cmd = "{ParReset/mac:" + FeederMAC + "}"; data = Encoding.UTF8.GetBytes(cmd); udpClient.Send(data, data.Length, ip); udpClient.Client.ReceiveTimeout = 5000; var da = udpClient.Receive(ref ip); string rev = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r'); if (string.Equals(rev, cmd)) { return true; } else { return false; } } catch (Exception) { return false; } } /// /// 设置FeederIP /// /// /// /// /// /// /// public async Task SetFeederIP(string FeederMAC, string TargetIp, int TargetPort, string TargetSub, NetworkInterfaceInfo network=null) { try { if (network != null) { Bind(network.IPv4Address.ToString()); } // 设置服务IP(这个IP地址是服务器的IP),设置端口号 IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234); //发送信息 byte[] data = new byte[1024]; string cmd = "{ipset/mac:" + $"{FeederMAC}/ip:{TargetIp}:{TargetPort}/sub:{TargetSub}" + "}"; data = Encoding.UTF8.GetBytes(cmd); await udpClient.SendAsync(data, data.Length, ip); udpClient.Client.ReceiveTimeout = 5000; var dataas=await udpClient.ReceiveAsync(); var da = dataas.Buffer; //var da = udpClient.Receive(ref ip); string rev = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r'); if (string.Equals(rev, cmd)) { return true; } else { return false; } } catch (Exception) { return false; } } /// /// 对比两个IP地址是否在同网段 /// /// /// /// public bool AreFirstThreeOctetsEqual(IPAddress ip1, IPAddress ip2) { byte[] bytes1 = ip1.GetAddressBytes(); byte[] bytes2 = ip2.GetAddressBytes(); // 比较前三个字节 for (int i = 0; i < 3; i++) { if (bytes1[i] != bytes2[i]) { return false; } } return true; } public void Disposed() { udpClient.Client.Close(); udpClient.Client.Dispose(); } ~FeederIPManage() { Disposed(); } } }