VB中如何解决多网卡配置相同静态IP引发的冲突问题
网卡切换静态IP触发冲突问题解决方案
核心实现代码
现有用于设置网卡静态IP的VB.NET代码基于WMI实现,逻辑如下:
Public Shared Sub SetIP(ByVal nicName As String, ByVal IpAddresses As String, ByVal SubnetMask As String, ByVal gateway As String, ByVal dnsSearch1 As String, ByVal dnsSearch2 As String) Dim objMC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration") Dim objMOC As ManagementObjectCollection = objMC.GetInstances() For Each objMO As ManagementObject In objMOC ' 过滤已启用的物理设备,排除VMWare虚拟网卡、存储卡类虚拟设备 If objMO("IPEnabled") Then If (objMO("Caption").Equals(nicName)) Then Dim objNewIP As ManagementBaseObject = objMO.GetMethodParameters("EnableStatic") Dim objNewGate As ManagementBaseObject = objMO.GetMethodParameters("SetGateways") Dim objNewDns As ManagementBaseObject = objMO.GetMethodParameters("SetDNSServerSearchOrder") ' 配置默认网关及跃点 objNewGate("DefaultIPGateway") = New String() {gateway} objNewGate("GatewayCostMetric") = New Integer() {1} ' 配置IP地址与子网掩码,支持多IP传入 objNewIP("IPAddress") = IpAddresses.Split(","c) objNewIP("SubnetMask") = New String() {SubnetMask} ' 配置主备DNS服务器 Dim dns() As String = {dnsSearch1, dnsSearch2} objNewDns("DNSServerSearchOrder") = dns ' 依次应用所有配置 objMO.InvokeMethod("EnableStatic", objNewIP, Nothing) objMO.InvokeMethod("SetGateways", objNewGate, Nothing) objMO.InvokeMethod("SetDNSServerSearchOrder", objNewDns, Nothing) Exit For End If End If Next End Sub
问题根因
当前WIFI网卡已绑定静态IP172.25.35.12,直接给同主机的以太网网卡配置相同IP时,Windows TCP/IP协议栈会检测到同一台设备上两块同时启用的网卡持有相同IP地址,触发IP冲突保护机制,自动禁用先持有该IP的WIFI网卡,最终导致配置异常。
解决方法
配置新网卡前必须先重置原有网卡的IP配置,从根源避免双网卡同时绑定同IP的冲突场景,具体执行流程:
- 第一步:新增网卡重置逻辑,在给以太网设置静态IP前,先定位到当前持有目标IP的WIFI网卡,调用WMI方法将其切换为DHCP自动获取模式,清空原有静态IP、网关、DNS配置,确认旧IP已从WIFI网卡解绑。
网卡重置的参考实现代码:Public Shared Sub ResetNicToDHCP(ByVal nicName As String) Dim objMC As ManagementClass = New ManagementClass("Win32_NetworkAdapterConfiguration") Dim objMOC As ManagementObjectCollection = objMC.GetInstances() For Each objMO As ManagementObject In objMOC If CBool(objMO("IPEnabled")) AndAlso objMO("Caption").Equals(nicName) Then ' 开启IP地址自动获取 objMO.InvokeMethod("EnableDHCP", Nothing, Nothing) ' 清空静态DNS配置,改为自动获取 objMO.InvokeMethod("SetDNSServerSearchOrder", Nothing, Nothing) Exit For End If Next End Sub - 第二步:确认WIFI网卡IP释放完成后,再调用原有
SetIP方法为以太网网卡配置目标静态IP、子网掩码、网关和DNS参数,此时不会触发IP冲突,也不会出现WIFI网卡被系统强制禁用的问题。 - 额外优化点:配置切换完成后可以根据需要禁用WIFI网卡,进一步避免后续路由优先级异常的问题;如果需要保留WIFI网卡启用,必须确保两块网卡的IP不在同一网段,否则仍会出现路由冲突。
内容的提问来源于stack exchange,提问作者Shahrul Amir
相关产品推荐
相关产品推荐

