【问题标题】:SetIpInterfaceEntry returns ERROR_INVALID_PARAMETERSetIpInterfaceEntry 返回 ERROR_INVALID_PARAMETER
【发布时间】:2019-02-25 20:43:07
【问题描述】:

我正在尝试执行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;

这是之前sn-p的输出:

GetIpInterfaceEntry result: 0; InterfaceIndex: 13
SetIpInterfaceEntry result: 87

根据the docERROR_INVALID_PARAMETER的可能原因有:

传递给函数的参数无效。如果在 Row 参数中传递了 NULL 指针,则返回此错误Row 参数指向的MIB_IPINTERFACE_ROWInterfaceIndex 成员未指定。

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

我的问题很明显:我做错了什么?该方法可以调用哪种接口有什么限制吗? (我打电话给实体。)还有其他建议吗?

谢谢!

更新:我忘了说,如果你想执行这段代码 sn-p 你应该:

#include <winsock2.h>
#include <netioapi.h>

还有链接iphlpapi.lib

【问题讨论】:

  • 如果row.Family 被指定为AF_INET6 会发生什么?
  • 我无法用你的代码重现它,SetIpInterfaceEntry 刚刚在 win10,1809 上成功(返回 0),构建 17763。你能提供你的环境信息吗?

标签: c++ winapi


【解决方案1】:

解决了,感谢我的同事...

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

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

只要我在SetIpInterfaceEntry 调用之前插入以下行,一切就正常了:

row.SitePrefixLength = 0;

虽然它解决了问题,但仍有几个悬而未决的问题:

  1. 实际电流值无效是怎么回事?
  2. 如果在那里遇到无效值,应该设置什么值?看起来将其设置为 0 是答案,但我不确定。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多