我正在尝试执行SetIpInterfaceEntry函数,但是我总是得到ERROR_INVALID_PARAMETER
的结果。我想更改哪个确切参数并不重要,因为即使我没有进行任何更改,也会遇到此错误。这是C ++代码示例,它不会改变任何内容,但输出始终相同:
// Initialize MIB_IPINTERFACE_ROW with actual InterfaceLuid:
auto row = MIB_IPINTERFACE_ROW{ AF_INET, 1689399632855040 };
auto result = GetIpInterfaceEntry(&row);
// Just to confirm GetIpInterfaceEntry success print result and InterfaceIndex:
std::cout << "GetIpInterfaceEntry result: " << result << "; InterfaceIndex: " << row.InterfaceIndex << std::endl;
// Try to execute SetIpInterfaceEntry, without any change:
result = SetIpInterfaceEntry(&row);
// Result is always ERROR_INVALID_PARAMETER (87):
std::cout << "SetIpInterfaceEntry result: " << result << std::endl;
这是上一个代码片段的输出:
GetIpInterfaceEntry result: 0; InterfaceIndex: 13
SetIpInterfaceEntry result: 87
根据the doc,ERROR_INVALID_PARAMETER
的可能原因是:
无效的参数传递给该函数。如果在Row参数中传递了
NULL
指针,并且未将Row参数指向的MIB_IPINTERFACE_ROW
的Family成员指定为AF_INET
或AF_INET6
,则会返回此错误,或未指定Row参数指向的InterfaceLuid
的{{1}}或InterfaceIndex
成员。
在我的情况下,这两个都不是正确的(我刚得到了实际的结构)。
我的问题很明显:我做错了什么?可以调用该方法的接口有什么限制? (我在呼吁身体上的。)还有其他建议吗?
谢谢!
更新:我忘了提及这一点,如果您想执行此代码段,则应该:
MIB_IPINTERFACE_ROW
还要链接#include <winsock2.h>
#include <netioapi.h>
。
答案 0 :(得分:1)
解决了,多亏了我的同事...
原因是根据我的情况,row.SitePrefixLength
字段最初设置为64
,根据MIB_IPINTERFACE_ROW doc page,这是一个非法值:
对于IPv4地址,任何大于32的值都是非法值。
在致电SetIpInterfaceEntry之前插入以下行,一切就OK了:
row.SitePrefixLength = 0;
尽管它解决了问题,但仍然存在一些未解决的问题:
0
是答案,但是我不确定。但是首先,我可能应该找出SitePrefixLength
字段/参数的目的。 :)
更新:我刚刚找到了我剩下的第二个问题的答案-它一直在the same doc page中出现(因为不阅读所有内容而感到羞耻)。答案是:
对于IPv4,必须将
SitePrefixLength
成员设置为0。