SetIpInterfaceEntry返回ERROR_INVALID_PARAMETER

时间:2019-02-24 22:44:22

标签: c++ winapi

我正在尝试执行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 docERROR_INVALID_PARAMETER的可能原因是:

  

无效的参数传递给该函数。如果在Row参数中传递了NULL指针,并且未将Row参数指向的MIB_IPINTERFACE_ROW的Family成员指定为AF_INETAF_INET6,则会返回此错误,或未指定Row参数指向的InterfaceLuid的{​​{1}}或InterfaceIndex成员。

在我的情况下,这两个都不是正确的(我刚得到了实际的结构)。

我的问题很明显:我做错了什么?可以调用该方法的接口有什么限制? (我在呼吁身体上的。)还有其他建议吗?

谢谢!

更新:我忘了提及这一点,如果您想执行此代码段,则应该:

MIB_IPINTERFACE_ROW

还要链接#include <winsock2.h> #include <netioapi.h>

1 个答案:

答案 0 :(得分:1)

解决了,多亏了我的同事...

原因是根据我的情况,row.SitePrefixLength字段最初设置为64,根据MIB_IPINTERFACE_ROW doc page,这是一个非法值:

  

对于IPv4地址,任何大于32的值都是非法值。

在致电SetIpInterfaceEntry之前插入以下行,一切就OK了:

row.SitePrefixLength = 0;

尽管它解决了问题,但仍然存在一些未解决的问题:

  1. 实际当前值无效是怎么发生的?
  2. 如果在那里遇到无效值,应输入什么值?看来将其设置为0是答案,但是我不确定。

但是首先,我可能应该找出SitePrefixLength字段/参数的目的。 :)

更新:我刚刚找到了我剩下的第二个问题的答案-它一直在the same doc page中出现(因为不阅读所有内容而感到羞耻)。答案是:

  

对于IPv4,必须将SitePrefixLength成员设置为0。