缓冲区大小为GetAdaptersInfo
问题描述:
DWORD GetAdaptersInfo(
__out PIP_ADAPTER_INFO pAdapterInfo,
__inout PULONG pOutBufLen
);
的pOutBufLen
的描述如下:
pOutBufLen
[在,out]指向的大小,以字节为单位的缓冲区由pAdapterInfo参数指示。如果此大小不足以保存适配器信息,则此函数将填充所需大小的缓冲区,并返回错误代码ERROR_BUFFER_OVERFLOW。
现在我的问题是,我们怎么才能知道应该是什么样的缓冲区大小,即pOutBufLen? 如果我们有16个以上的网卡,那么正确的方法是什么?
来源msdn
答
使用它是这样的常用方法:
IP_ADAPTER_INFO *buffer= NULL;
ULONG length = 0;
// call with length of 0. It'll fail, but tell us needed size.
GetAdaptersInfo(buffer, &length);
// allocate space needed.
buffer = malloc(length);
// Call again, with necessary size.
if (buffer != NULL)
GetAdaptersInfo(bufer, &length);
至少在理论上,你应该真正做到这一点的while
循环,或者说为了的东西 - 呼叫,分配,再次呼叫,并继续重新分配和重新呼叫,直到它成功。
这将让它(最终)成功,即使用户发生在一个网络适配器的第一和第二呼叫之间只是堵塞,所以即使你分配它认为将需要的空间,它变得不足然后才能进行第二次通话。
哦,所以该功能有两种方式。 伟大的答案,谢谢:) –
不要忘记从malloc投下返回,因为这是标记为C++。 –
是的,我知道,谢谢你的头像:) (PIP_ADAPTER_INFO)malloc(dwBufLen)即,如果我们使用PIP_ADAPTER_INFO而不是IP_ADAPTER_INFO –