我制作的程序需要为计算机的有线网卡设置静态IP,程序无法执行下一部分(从另一部分IP查询SNMP字符串)相同的网络),直到它积极地设置和使用,这种经验告诉我并不总是即时的。该程序在VS2013上以C#编写为WinForms应用程序,其功能如下。 IP地址的实际设置工作正常,问题是在更改完成时尝试轮询。我可以运行该程序,让它设置一个IP地址(永远不会超过单个IP /子网/网关),并且当它仍然轮询更改时,弹出一个命令提示符,运行ipconfig,然后看到变化已经过去了。该程序将继续挂起,直到超时。我已经尝试了几种不同的查询和检查IP地址的方法,包括每次通过循环重新分配NICConfig并检查字符串[]中的任何IP地址是否匹配,什么都不起作用。我还没有将currentIPs [0]传送到文件或命令行来查看它包含的内容,但我强烈怀疑它将包含以前的IP地址。我也尝试在注册表中设置IP地址,根据这篇帖子:Why does applying a static IP address via WMI work just once?但是所有为我做的就是在ipconfig中为该接口提供第二个IP地址,程序仍然挂起。
实际上,在进一步检查时,看起来行为是将IP地址/子网/网关添加到列表(字符串数组),而不是替换旧信息,但程序甚至没有获得列表的更新版本,其上包含预期的IP。在使用上述链接中的代码弄乱注册表值之后,可能尚未启动,我无法确定。我似乎也无法从我的PC配置中删除额外的IP,它们不会显示在windows ipv4配置页面中(但是关闭多个网关时我会收到警告) ,并从注册表中删除它们似乎什么都不做 - 所以任何帮助修复我的计算机的NIC配置也将不胜感激。
private bool set_staticIP(string Index, string[] IP, string[] Subnet, string[] Gateway, string[] DNS)
{
string WMIQuery = String.Format("Win32_NetworkAdapterConfiguration.Index='{0}'", Index);
ManagementObject NICConfig = new ManagementObject(@"root\CIMV2", WMIQuery, null);
ManagementBaseObject inParams = null;
ManagementBaseObject outParams = null;
string[] OldIP = (string[])NICConfig["IPAddress"];
try
{
/* Set IP/Subnet mask */
inParams = NICConfig.GetMethodParameters("EnableStatic");
inParams["IPAddress"] = IP;
inParams["SubnetMask"] = Subnet;
outParams = NICConfig.InvokeMethod("EnableStatic", inParams, null);
if (outParams["ReturnValue"].ToString() != "0")
{
MessageBox.Show("Error setting IP, returned " + outParams["ReturnValue"]);
}
/* Set Gateway(s) */
inParams = NICConfig.GetMethodParameters("SetGateways");
inParams["DefaultIPGateway"] = Gateway;
inParams["GatewayCostMetric"] = new int[] {1};
outParams = NICConfig.InvokeMethod("SetGateways", inParams, null);
if (outParams["ReturnValue"].ToString() != "0")
{
MessageBox.Show("Error setting Gateway, returned " + outParams["ReturnValue"]);
}
/* Set DNS Servers */
inParams = NICConfig.GetMethodParameters("SetDNSServerSearchOrder");
inParams["DNSServerSearchOrder"] = DNS;
outParams = NICConfig.InvokeMethod("SetDNSServerSearchOrder", inParams, null);
if (outParams["ReturnValue"].ToString() != "0")
{
MessageBox.Show("Error setting DNS, returned " + outParams["ReturnValue"]);
}
bool IPMatches = false;
string[] currentIPs = null;
int timeout = 2000;
int i;
for (i = 0; i < timeout && !IPMatches; i++)
{
currentIPs = (string[])NICConfig["IPAddress"];
if (currentIPs == IP || currentIPs != OldIP)
{
IPMatches = true;
break;
}
Task.Delay(100);
}
if (i >= timeout)
{
MessageBox.Show("Timeout while setting static IP address");
}
}
catch(ManagementException e)
{
MessageBox.Show("set_static() threw exception " + e.Message);
}
return IPMatches;
}
我测试过的机器是运行Windows 7 x64的笔记本电脑,内部网卡和USB网卡以及运行Windows 8.1 x64且具有相同USB网卡的平板电脑具有相同的行为。
答案 0 :(得分:0)
您可以使用:
// Callback für Netzwerk-Änderungen erzeugen
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(AddressChangedCallback);
// Callback für Netzwerk-Änderungen
void AddressChangedCallback(object sender, EventArgs e)
{
// IP is changed;
}
每当更改网络地址时,您都会收到回叫。现在你可以检查它是否是你正在等待的地址。