用的是GetAdaptersInfo()函数。Windows API的这些函数,有一个共同点。一般都是先传入一个NULL指针,此时函数返回一个长度值,告诉你需要申请多大的空间才够用。然后再new一个这么大的空间,去获取有效的值。
int WIN_GetAdapter(WIN_AdapterList& adapters)
{
IP_ADAPTER_INFO* pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// Make an initial call to GetAdaptersInfo to get the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if(::GetAdaptersInfo(pAdapterInfo,&ulOutBufLen) == ERROR_SUCCESS)
{
IP_ADAPTER_INFO* p = pAdapterInfo;
while(p)
{
WIN_Adapter na;
memcpy(na.mac, p->Address, 6); // MAC地址
strcpy(na.name, p->AdapterName);
strcpy(na.description, p->Description);
strcpy(na.ip, p->IpAddressList.IpAddress.String);
strcpy(na.mask, p->IpAddressList.IpMask.String);
strcpy(na.gateway, p->GatewayList.IpAddress.String);
adapters.push_back(na);
p = p->Next;
}
}
free(pAdapterInfo);
return 0;
}