使用QT5.7.0,执行Powershell命令New-NetIPAddress,waitForFinished(),然后使用icmpSendEcho2返回0,调用GetLastError 0时得到的返回值为0,是什么原因造成的?
我正在使用 64 位 Windows 10 操作系统,我在其中执行 .exe,并且可以访问我尝试 ping 的地址。当我更改接口的 IP 地址时,我会“随机”收到上述错误,并且不时会从下一个路由器得到答案——当我点击正确的接口时,无法到达目的地或 ping 成功。
从文档MSDN IcmpSendEcho2我读到返回 0 后,我应该检查 GetLastError。从文档错误代码 0 - 499返回值 0 表示没有错误。
在一些线程中提到了另一个 Windows 进程可以同时执行。这可能是 GetLastError 返回 0 的情况吗?
当我更改 IP 并随后 ping 时会出现此问题。当 IP 已经设置时,我在不更改 IP 地址的情况下 ping 并且行为就像我认为应该的那样。
代码按此顺序执行,简化:
if (ipIsSet()==false){ //check if the IP address is already configured
changeIP(interface,IPAddress,maskPrefix);
ping();
} else {
ping();
}
其中 changeIP 函数包含以下内容:
int ipconfig::changeIP(QString interfaceNew, QString newIPAddress, QString newSubnet){
QProcess IPProcess;
QStringList commands;
commands.clear();
commands <<"New-NetIPAddress"<<"-InterfaceAlias"<<"\""+interfaceNew+"\""<<"-IPAddress"<<"\""+newIPAddress+"\""<<"-PrefixLength"<<newSubnet;
IPProcess.start("powershell",commands);
IPProcess.waitForFinished();
QString pStdout = IPProcess.readAllStandardOutput();
QString pStderr = IPProcess.readAllStandardError();
if (pStderr.size() > 1){ //Error
emit status("Fehler bei Adapter "+interfaceNew+".\ Folgender Fehler ist aufgetreten: \n"+pStderr+"\n");
return 0;
} else {
emit status("Adapter "+interfaceNew+" wurde mit IP konfiguriert.\n");
return 1;
}
return 0;
} //end change IP
并且 ping() 函数包含以下内容:
int ipconfig::ping(){
dwRetVal = 0, dwError = 0, replySize = 0;
emit status("Ping wird initialisiert.\n");
hIcmpFile = IcmpCreateFile();
if(hIcmpFile==INVALID_HANDLE_VALUE){
emit status("Windows Handle konnte nicht erstellt werden.\n");
emit pingFinished();
return 0;
}
replySize = sizeof(ICMP_ECHO_REPLY)+sizeof(SendData)+8;
ReplyBuffer = (VOID*)malloc(replySize);
if(ReplyBuffer==NULL){
emit status ("Buffer Speicher konnte nicht belegt werden.\n");
emit pingFinished();
return 9;
}
QByteArray array = pingAddress.toLocal8Bit();
const char* buffer = array.data();
ulIPAddr = inet_addr(buffer);
qDebug()<<ulIPAddr;
dwRetVal = IcmpSendEcho2(hIcmpFile, NULL,NULL, NULL, ulIPAddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, replySize, 1000);
emit status ("dwRetVal = "+QString::number(dwRetVal));
if (dwRetVal != 0){
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
struct in_addr ReplyAddr;
ReplyAddr.S_un.S_addr = pEchoReply->Address;
emit status ("Sende Ping zu "+pingAddress);
if (dwRetVal>1){
qDebug()<<"Antwort: "<<dwRetVal;
} else {
qDebug()<<"Antwort: "<<dwRetVal;
}
QString str = inet_ntoa(ReplyAddr);
emit status ("Antwort von: " + str);
if (ReplyAddr.S_un.S_addr == ulIPAddr){
emit status("Ping erfolgreich.\n");
emit pingFinished();
return 1;
}
emit status ("Antwort von falscher Adresse.\n");
emit pingFinished();
return 404;
}
else {
qDebug()<<"ICMP fehlgeschlagen";
dwError=GetLastError();
settingsLogging(dwError);
switch (dwError) {
case IP_BUF_TOO_SMALL:
qDebug()<<"ReplyBuffer zu klein";
emit status ("Antwort Buffer zu klein.\n");
emit pingFinished();
return 8;
break;
case IP_REQ_TIMED_OUT:
qDebug()<<"Timeout";
emit status ("Timout bei Ping.\n");
emit pingFinished();
return 7;
break;
default:
emit status ("Unbekannter Fehler bei Ping: "+QString::number(dwError));
emit pingFinished();
return 10;
break;
}
emit status ("Extended Error.\n");
//emit IPSetStatus(false);
emit pingFinished();
return 100;
}
}