From e9ad1f0256f0bba34f47696a2d9c78b9971eec26 Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Fri, 18 Jul 2025 12:28:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=B8=BB=E6=9C=BAip=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/Controllers/NetConfigController.cs | 14 ++++- server/src/Peripherals/NetConfigClient.cs | 56 +++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/server/src/Controllers/NetConfigController.cs b/server/src/Controllers/NetConfigController.cs index 2ebfc01..451b31f 100644 --- a/server/src/Controllers/NetConfigController.cs +++ b/server/src/Controllers/NetConfigController.cs @@ -153,7 +153,7 @@ public class NetConfigController : ControllerBase try { var netConfig = new NetConfig(BOARD_IP, BOARD_PORT, 0); - + var hostIPResult = await netConfig.GetHostIP(); var boardIPResult = await netConfig.GetBoardIP(); var hostMACResult = await netConfig.GetHostMAC(); @@ -345,7 +345,8 @@ public class NetConfigController : ControllerBase { try { - // 获取本机第一个有效的IPv4地址 + // 获取所有本机IPv4地址,并选择与实验板IP前三段相同的IP + var boardIpSegments = BOARD_IP.Split('.').Take(3).ToArray(); var ip = System.Net.NetworkInformation.NetworkInterface .GetAllNetworkInterfaces() .Where(nic => nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up @@ -353,7 +354,14 @@ public class NetConfigController : ControllerBase .SelectMany(nic => nic.GetIPProperties().UnicastAddresses) .Where(addr => addr.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) .Select(addr => addr.Address) - .FirstOrDefault(); + .FirstOrDefault(addr => + { + var segments = addr.ToString().Split('.'); + return segments.Length == 4 && + segments[0] == boardIpSegments[0] && + segments[1] == boardIpSegments[1] && + segments[2] == boardIpSegments[2]; + }); if (ip == null) return StatusCode(StatusCodes.Status500InternalServerError, "无法获取本机IP地址"); diff --git a/server/src/Peripherals/NetConfigClient.cs b/server/src/Peripherals/NetConfigClient.cs index a05b776..3ed4a6c 100644 --- a/server/src/Peripherals/NetConfigClient.cs +++ b/server/src/Peripherals/NetConfigClient.cs @@ -54,6 +54,13 @@ public class NetConfig // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } + var ipBytes = ip.GetAddressBytes(); var ret = await UDPClientPool.WriteAddrSeq(this.ep, this.taskID, NetConfigAddr.HOST_IP, ipBytes, this.timeout); @@ -98,6 +105,13 @@ public class NetConfig // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } + var ipBytes = ip.GetAddressBytes(); var ret = await UDPClientPool.WriteAddrSeq(this.ep, this.taskID, NetConfigAddr.BOARD_IP, ipBytes, this.timeout); @@ -146,6 +160,13 @@ public class NetConfig // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } var ret = await UDPClientPool.WriteAddrSeq(this.ep, this.taskID, NetConfigAddr.HOST_MAC, macAddress, this.timeout); if (!ret.IsSuccessful) @@ -193,6 +214,13 @@ public class NetConfig // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } var ret = await UDPClientPool.WriteAddrSeq(this.ep, this.taskID, NetConfigAddr.BOARD_MAC, macAddress, this.timeout); if (!ret.IsSuccessful) @@ -234,6 +262,13 @@ public class NetConfig { // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } var ret = await UDPClientPool.ReadAddrSeq(this.ep, this.taskID, NetConfigAddr.HOST_IP, this.timeout); if (!ret.IsSuccessful) @@ -261,6 +296,13 @@ public class NetConfig { // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } var ret = await UDPClientPool.ReadAddrSeq(this.ep, this.taskID, NetConfigAddr.BOARD_IP, this.timeout); if (!ret.IsSuccessful) @@ -289,6 +331,13 @@ public class NetConfig // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } + var ret = await UDPClientPool.ReadAddrSeq(this.ep, this.taskID, NetConfigAddr.HOST_MAC, this.timeout); if (!ret.IsSuccessful) { @@ -315,6 +364,13 @@ public class NetConfig { // 清除UDP服务器接收缓冲区 MsgBus.UDPServer.ClearUDPData(this.address, this.taskID); + + // 刷新ARP + var refrshRet = await Arp.UpdateArpEntryByPingAsync(this.address); + if (!refrshRet) + { + logger.Warn($"Refrash Arp failed, but maybe not a big deal."); + } var ret = await UDPClientPool.ReadAddrSeq(this.ep, this.taskID, NetConfigAddr.BOARD_MAC, this.timeout); if (!ret.IsSuccessful)