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();
}
}
}