0

使用以下代码,或多或少从GetAdaptersAddresses 的 MSDN 示例复制粘贴,我得到返回值 122,这意味着 ERROR_INSUFFICIENT_BUFFER(根据此系统错误代码列表)。

ULONG outBufLen = 150000;   // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);
DWORD dwRetVal = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen);
// ....
free(pAddresses);

GetAdaptersAddresses 的文档未将 ERROR_INSUFFICIENT_BUFFER 列为预期返回值之一。(它列出了 ERROR_BUFFER_OVERFLOW,它应该将 outBufLen 调整为所需的值,但保持不变)。

相反,使用 GetAdaptersInfo 会导致相同的症状。

此错误不会发生在我的开发机器上,而是在一个虚拟和一个真正干净的 Windows 7 x86 SP1 安装上(添加了 VC++ 可再发行组件)。

作为一个 c++ 新手,我做错了吗?什么可能导致此错误以及如何解决?=)

4

4 回答 4

4

首先,您可以 - 正如其他人建议的那样 - 进行两次调用,找出所需的缓冲区大小,然后执行查询本身。特别是如果您看到错误,您的第一次尝试是询问 API 它预期的大小。

其次,您需要知道此 API 在消耗大量内存的 32 位进程中不太安全,因此缓冲区跨越到更高的 2GB 地址空间。API 可能会以一种奇怪的方式开始行动,要么是由于其自身的错误,要么是由于底层中的错误。请在此处查看有关 MS Connect 的详细信息:GetAdaptersAddressesAPI 错误地为具有高内存消耗的进程返回没有适配器

错误代码不是“预期的返回值之一”这一事实告诉版本错误来自底层,并且此 API 只是在内部故障时将其传递。作为线索,禁用系统上的某些网络适配器,您可能会摆脱错误。

于 2012-09-05T10:59:46.363 回答
1

Visual Studio 与我的项目一起部署了一个名为“IPHLPAPI.dll”的库,这导致了问题。删除此文件解决了它。

为什么会出现这种情况有待进一步研究=)

于 2012-09-05T10:51:38.160 回答
0

首先,缓冲区是一块内存。

所以不足可能意味着你没有以某种方式给它足够的内存。我们可能是一块您无权访问的内存。也许地址甚至不存在。

看这个:

ERROR_INSUFFICIENT_BUFFER
    122 (0x7A)

    The data area passed to a system call is too small.

这听起来真的像缓冲区没有足够的分配内存。或类似的。

也许

outBufLen 

必须是特定的长度,可能是内存块的大小。因为有时它不检查“名称”,而是尝试比较每个变量的大小。这个想法来自高级着色器语言。

所以我会尝试多看一点:

ULONG outBufLen = 150000;   // Tried for different (large) values here...
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES *) malloc(outBufLen);

祝你好运!

于 2012-09-05T10:23:21.303 回答
0

要知道所需的确切缓冲区大小,您只需将 NULL 传递给 pAddresses,大小将设置为所需的大小。您可能需要稍微重写您的代码以使其正常工作;

DWORD rv, size = 0;
PIP_ADAPTER_ADDRESSES adapter_addresses;

rv = GetAdaptersAddresses(AF_INET, 0, NULL, NULL, &size);
if (rv != ERROR_BUFFER_OVERFLOW)
    return false; // ERROR

adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size);

rv = GetAdaptersAddresses(AF_INET, 0, NULL, adapter_addresses, &size);
if (rv != ERROR_SUCCESS) {
    free(adapter_addresses);
    return false; // ERROR
}
于 2012-09-05T10:31:32.503 回答