FeederIPManage.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net.NetworkInformation;
  5. using System.Net.Sockets;
  6. using System.Net;
  7. using System.Text;
  8. using System.Text.RegularExpressions;
  9. using System.Threading.Tasks;
  10. using Team.FFFeederService.Models;
  11. using System.Net.Mail;
  12. using static System.Net.Mime.MediaTypeNames;
  13. using TouchSocket.Sockets;
  14. namespace Team.FFFeederService
  15. {
  16. public class FeederIPManage
  17. {
  18. UdpClient udpClient;
  19. public FeederIPManage()
  20. {
  21. udpClient = new UdpClient();
  22. }
  23. /// <summary>
  24. /// 获取所有的Feeder
  25. /// </summary>
  26. /// <returns></returns>
  27. public async Task<List<FeederNetworkInterfaceInfo>> Scan()
  28. {
  29. return await Task.Run(() => {
  30. List<FeederNetworkInterfaceInfo> feeders1 = new List<FeederNetworkInterfaceInfo>();
  31. try
  32. {
  33. var netList = GetAllNetworkInterface();
  34. foreach (var item in netList)
  35. {
  36. Bind(item.IPv4Address.ToString());
  37. var feeders = GetFeederList(item);
  38. foreach (var item1 in feeders)
  39. {
  40. feeders1.Add(item1);
  41. }
  42. }
  43. }
  44. catch (Exception)
  45. {
  46. }
  47. return feeders1;
  48. });
  49. }
  50. public void Bind(string ip)
  51. {
  52. // 指定要绑定的本地地址和端口
  53. IPAddress localIpAddress = IPAddress.Parse(ip); // 你想要使用的网口的IP地址
  54. int localPort = 8000; // 你想要绑定的端口号
  55. udpClient.Client.Close();
  56. udpClient.Client.Dispose();
  57. udpClient = new UdpClient();
  58. udpClient.Client.Bind(new IPEndPoint(localIpAddress, localPort));
  59. }
  60. /// <summary>
  61. /// 获取所有已连接网口的IP地址
  62. /// </summary>
  63. /// <returns></returns>
  64. public NetworkInterfaceInfo[] GetAllNetworkInterface()
  65. {
  66. List<NetworkInterfaceInfo> networks = new List<NetworkInterfaceInfo>();
  67. // 获取计算机上所有的网络接口
  68. NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
  69. // 遍历每个网络接口,并获取其IP地址信息
  70. foreach (NetworkInterface networkInterface in networkInterfaces)
  71. {
  72. // 排除回环接口和虚拟接口等
  73. if (networkInterface.OperationalStatus == OperationalStatus.Up &&
  74. networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback &&
  75. networkInterface.NetworkInterfaceType != NetworkInterfaceType.Tunnel &&
  76. networkInterface.NetworkInterfaceType != NetworkInterfaceType.Unknown)
  77. {
  78. // 获取该网络接口的IP属性集合
  79. IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
  80. // 遍历该网络接口的IP地址信息
  81. foreach (UnicastIPAddressInformation ip1 in ipProperties.UnicastAddresses)
  82. {
  83. // 仅输出IPv4地址
  84. if (ip1.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  85. {
  86. // 输出IPv4地址信息
  87. Console.WriteLine($"网口名称: {networkInterface.Name}");
  88. Console.WriteLine($"IPv4地址: {ip1.Address.ToString()}");
  89. Console.WriteLine($"子网掩码: {ip1.IPv4Mask}");
  90. networks.Add(new NetworkInterfaceInfo { Name = networkInterface.Name, IPv4Address = ip1.Address, IPv4Mask = ip1.IPv4Mask });
  91. }
  92. }
  93. }
  94. }
  95. return networks.ToArray();
  96. }
  97. /// <summary>
  98. /// 搜寻Feeder
  99. /// </summary>
  100. /// <param name="udpClient"></param>
  101. /// <returns></returns>
  102. public FeederNetworkInterfaceInfo[] GetFeederList(NetworkInterfaceInfo network)
  103. {
  104. List<FeederNetworkInterfaceInfo> feeders = new List<FeederNetworkInterfaceInfo>();
  105. // 设置服务IP(这个IP地址是服务器的IP),设置端口号
  106. IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234);
  107. //发送信息
  108. byte[] data = new byte[1024];
  109. string cmd = "{udpscan}";
  110. data = Encoding.UTF8.GetBytes(cmd);
  111. udpClient.Send(data, data.Length, ip);
  112. udpClient.Client.ReceiveTimeout = 500;
  113. for (int i = 0; i < 10; i++)
  114. {
  115. try
  116. {
  117. var da = udpClient.Receive(ref ip);
  118. string config = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r');
  119. Console.WriteLine(config);
  120. //{ 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}
  121. var info1 = AnalysisIP(config);
  122. if (info1 != null)
  123. {
  124. info1.IsAccessible = AreFirstThreeOctetsEqual(IPAddress.Parse(info1.IP), network.IPv4Address);
  125. info1.Network = network;
  126. feeders.Add((FeederNetworkInterfaceInfo)info1);
  127. }
  128. ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234);
  129. }
  130. catch (Exception)
  131. {
  132. break;
  133. }
  134. }
  135. return feeders.ToArray();
  136. }
  137. /// <summary>
  138. /// 解析Feeder的IP等信息
  139. /// </summary>
  140. /// <param name="input"></param>
  141. /// <returns></returns>
  142. public FeederNetworkInterfaceInfo AnalysisIP(string input)
  143. {
  144. // 定义正则表达式模式
  145. string pattern = @"{(?<Name>[^V]+)Ver(?<Version>[^\/]+)\/ip:(?<IP>[^:]+):(?<Port>\d+)\/sub:(?<Subnet>[^\/]+)\/gw:(?<Gateway>[^\/]+)\/mac:(?<MAC>[^}]+)}";
  146. // 进行正则匹配
  147. Match match = Regex.Match(input, pattern);
  148. // 提取匹配的值
  149. if (match.Success)
  150. {
  151. string FF380 = match.Groups["Name"].Value.Trim();
  152. string version = match.Groups["Version"].Value.Trim(); ; // 提取版本号
  153. string IP = match.Groups["IP"].Value.Trim();
  154. string port = match.Groups["Port"].Value.Trim();
  155. string subnet = match.Groups["Subnet"].Value.Trim();
  156. string gateway = match.Groups["Gateway"].Value.Trim();
  157. string MAC = match.Groups["MAC"].Value.Trim();
  158. // 输出提取的值
  159. Console.WriteLine($"Name: {FF380}");
  160. Console.WriteLine($"Version: {version}");
  161. Console.WriteLine($"IP: {IP}");
  162. Console.WriteLine($"Port: {port}");
  163. Console.WriteLine($"子网掩码: {subnet}");
  164. Console.WriteLine($"网关: {gateway}");
  165. Console.WriteLine($"MAC: {MAC}");
  166. return new FeederNetworkInterfaceInfo
  167. {
  168. FeederType = FF380,
  169. Version = version,
  170. IP = IP,
  171. Port = int.Parse(port),
  172. Subnet = subnet,
  173. Gateway = gateway,
  174. MAC = MAC
  175. };
  176. }
  177. else
  178. {
  179. Console.WriteLine("No match found.");
  180. return null;
  181. }
  182. }
  183. /// <summary>
  184. /// 重置Feeder
  185. /// </summary>
  186. /// <param name="udpClient"></param>
  187. /// <param name="FeederMAC"></param>
  188. /// <returns></returns>
  189. public bool ResetFeeder(string FeederMAC, NetworkInterfaceInfo network = null)
  190. {
  191. try
  192. {
  193. if (network != null)
  194. {
  195. Bind(network.IPv4Address.ToString());
  196. }
  197. // 设置服务IP(这个IP地址是服务器的IP),设置端口号
  198. IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234);
  199. //发送信息
  200. byte[] data = new byte[1024];
  201. string cmd = "{ParReset/mac:" + FeederMAC + "}";
  202. data = Encoding.UTF8.GetBytes(cmd);
  203. udpClient.Send(data, data.Length, ip);
  204. udpClient.Client.ReceiveTimeout = 5000;
  205. var da = udpClient.Receive(ref ip);
  206. string rev = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r');
  207. if (string.Equals(rev, cmd))
  208. {
  209. return true;
  210. }
  211. else
  212. {
  213. return false;
  214. }
  215. }
  216. catch (Exception)
  217. {
  218. return false;
  219. }
  220. }
  221. /// <summary>
  222. /// 设置FeederIP
  223. /// </summary>
  224. /// <param name="FeederMAC"></param>
  225. /// <param name="TargetIp"></param>
  226. /// <param name="TargetPort"></param>
  227. /// <param name="TargetSub"></param>
  228. /// <param name="network"></param>
  229. /// <returns></returns>
  230. public async Task<bool> SetFeederIP(string FeederMAC, string TargetIp, int TargetPort, string TargetSub, NetworkInterfaceInfo network=null)
  231. {
  232. try
  233. {
  234. if (network != null)
  235. {
  236. Bind(network.IPv4Address.ToString());
  237. }
  238. // 设置服务IP(这个IP地址是服务器的IP),设置端口号
  239. IPEndPoint ip = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 1234);
  240. //发送信息
  241. byte[] data = new byte[1024];
  242. string cmd = "{ipset/mac:" + $"{FeederMAC}/ip:{TargetIp}:{TargetPort}/sub:{TargetSub}" + "}";
  243. data = Encoding.UTF8.GetBytes(cmd);
  244. await udpClient.SendAsync(data, data.Length, ip);
  245. udpClient.Client.ReceiveTimeout = 5000;
  246. var dataas=await udpClient.ReceiveAsync();
  247. var da = dataas.Buffer;
  248. //var da = udpClient.Receive(ref ip);
  249. string rev = Encoding.UTF8.GetString(da, 0, da.Length).TrimEnd('\n').TrimEnd('\r');
  250. if (string.Equals(rev, cmd))
  251. {
  252. return true;
  253. }
  254. else
  255. {
  256. return false;
  257. }
  258. }
  259. catch (Exception)
  260. {
  261. return false;
  262. }
  263. }
  264. /// <summary>
  265. /// 对比两个IP地址是否在同网段
  266. /// </summary>
  267. /// <param name="ip1"></param>
  268. /// <param name="ip2"></param>
  269. /// <returns></returns>
  270. public bool AreFirstThreeOctetsEqual(IPAddress ip1, IPAddress ip2)
  271. {
  272. byte[] bytes1 = ip1.GetAddressBytes();
  273. byte[] bytes2 = ip2.GetAddressBytes();
  274. // 比较前三个字节
  275. for (int i = 0; i < 3; i++)
  276. {
  277. if (bytes1[i] != bytes2[i])
  278. {
  279. return false;
  280. }
  281. }
  282. return true;
  283. }
  284. public void Disposed()
  285. {
  286. udpClient.Client.Close();
  287. udpClient.Client.Dispose();
  288. }
  289. ~FeederIPManage()
  290. {
  291. Disposed();
  292. }
  293. }
  294. }