| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- 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();
- }
- /// <summary>
- /// 获取所有的Feeder
- /// </summary>
- /// <returns></returns>
- public async Task<List<FeederNetworkInterfaceInfo>> Scan()
- {
- return await Task.Run(() => {
- List<FeederNetworkInterfaceInfo> feeders1 = new List<FeederNetworkInterfaceInfo>();
- 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));
- }
- /// <summary>
- /// 获取所有已连接网口的IP地址
- /// </summary>
- /// <returns></returns>
- public NetworkInterfaceInfo[] GetAllNetworkInterface()
- {
- List<NetworkInterfaceInfo> networks = new List<NetworkInterfaceInfo>();
- // 获取计算机上所有的网络接口
- 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();
- }
- /// <summary>
- /// 搜寻Feeder
- /// </summary>
- /// <param name="udpClient"></param>
- /// <returns></returns>
- public FeederNetworkInterfaceInfo[] GetFeederList(NetworkInterfaceInfo network)
- {
- List<FeederNetworkInterfaceInfo> feeders = new List<FeederNetworkInterfaceInfo>();
- // 设置服务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();
- }
- /// <summary>
- /// 解析Feeder的IP等信息
- /// </summary>
- /// <param name="input"></param>
- /// <returns></returns>
- public FeederNetworkInterfaceInfo AnalysisIP(string input)
- {
- // 定义正则表达式模式
- string pattern = @"{(?<Name>[^V]+)Ver(?<Version>[^\/]+)\/ip:(?<IP>[^:]+):(?<Port>\d+)\/sub:(?<Subnet>[^\/]+)\/gw:(?<Gateway>[^\/]+)\/mac:(?<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;
- }
- }
- /// <summary>
- /// 重置Feeder
- /// </summary>
- /// <param name="udpClient"></param>
- /// <param name="FeederMAC"></param>
- /// <returns></returns>
- 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;
- }
- }
- /// <summary>
- /// 设置FeederIP
- /// </summary>
- /// <param name="FeederMAC"></param>
- /// <param name="TargetIp"></param>
- /// <param name="TargetPort"></param>
- /// <param name="TargetSub"></param>
- /// <param name="network"></param>
- /// <returns></returns>
- public async Task<bool> 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;
- }
- }
- /// <summary>
- /// 对比两个IP地址是否在同网段
- /// </summary>
- /// <param name="ip1"></param>
- /// <param name="ip2"></param>
- /// <returns></returns>
- 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();
- }
- }
- }
|