addr.Format("%u", (unsigned int)((unsigned char*)pHost->h_addr_list[i])[j]); str += addr; } // str now contains one local IP address - do whatever you want to do with it (probably add it to a list) } }
// getiplist.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <windows.h> #include <stdlib.h> #include <IPIfCons.h> #include "Iphlpapi.h" #pragma comment(lib,"Iphlpapi")void Print_IP_ADAPTER_INFO(IP_ADAPTER_INFO* pAdapterInfo); void Print_IP_ADDR_STRING(IP_ADDR_STRING* paddr); int main(int argc, char* argv[]) { PIP_ADAPTER_INFO pAdapterInfo = NULL; PIP_ADAPTER_INFO pOriginalPtr; ULONG ulSizeAdapterInfo = 0; DWORD dwStatus; // Find out how big our buffer needs to be to hold the data dwStatus = GetAdaptersInfo(pAdapterInfo, &ulSizeAdapterInfo); if (dwStatus == ERROR_BUFFER_OVERFLOW) { // Allocate a buffer of the appropriate size if (!(pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulSizeAdapterInfo))) { printf("\n Insufficient Memory "); return(1); } // Obtain the Adapter Info dwStatus = GetAdaptersInfo(pAdapterInfo, &ulSizeAdapterInfo); }
if (dwStatus != ERROR_SUCCESS) { return(1); } pOriginalPtr = pAdapterInfo; if (pAdapterInfo == NULL) printf("\n No Interfaces Present.\n"); else { // Step through the adapter list while (pAdapterInfo != NULL) { Print_IP_ADAPTER_INFO(pAdapterInfo); pAdapterInfo = pAdapterInfo->Next; } } return 0; }void Print_IP_ADAPTER_INFO(IP_ADAPTER_INFO* pAdapterInfo) { if(pAdapterInfo==NULL) return; printf("\tAdapterName:%s\n",pAdapterInfo->AdapterName); printf("\tDescription:%s\n",pAdapterInfo->Description); printf("\tAddressLength:%d\n",pAdapterInfo->AddressLength); printf("\tAdrress:"); for(int i=0 ; i< pAdapterInfo->AddressLength ; i++) { BYTE b=pAdapterInfo->Address[i]; printf("%02x",b); } printf("\n"); printf("\tAdapterIndex:%d\n",pAdapterInfo->Index); printf("\tAdapter Type:"); switch(pAdapterInfo->Type) { case MIB_IF_TYPE_OTHER : printf("MIB_IF_TYPE_OTHER \n"); break; case MIB_IF_TYPE_ETHERNET : printf("MIB_IF_TYPE_ETHERNET \n"); break; case MIB_IF_TYPE_TOKENRING : printf("MIB_IF_TYPE_TOKENRING \n"); break; case MIB_IF_TYPE_FDDI : printf("MIB_IF_TYPE_FDDI \n"); break; case MIB_IF_TYPE_PPP : printf("MIB_IF_TYPE_PPP \n"); break; case MIB_IF_TYPE_LOOPBACK : printf("MIB_IF_TYPE_LOOPBACK \n"); break; case MIB_IF_TYPE_SLIP : printf("MIB_IF_TYPE_SLIP \n"); break; default: printf("unknown\n"); break; }
char szHostName[128];
if( gethostname(szHostName, 128) == 0 )
{
// Get host adresses
struct hostent * pHost;
int i;
pHost = gethostbyname(szHostName);
for( i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )
{
CString str;
int j;
for( j = 0; j < pHost->h_length; j++ )
{
CString addr;
if( j > 0 )
str += ".";
addr.Format("%u", (unsigned int)((unsigned
char*)pHost->h_addr_list[i])[j]);
str += addr;
}
// str now contains one local IP address - do whatever you want to do with it (probably add it to a list)
}
}
//#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <IPIfCons.h>
#include "Iphlpapi.h"
#pragma comment(lib,"Iphlpapi")void Print_IP_ADAPTER_INFO(IP_ADAPTER_INFO* pAdapterInfo);
void Print_IP_ADDR_STRING(IP_ADDR_STRING* paddr);
int main(int argc, char* argv[])
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
PIP_ADAPTER_INFO pOriginalPtr;
ULONG ulSizeAdapterInfo = 0;
DWORD dwStatus; // Find out how big our buffer needs to be to hold the data
dwStatus = GetAdaptersInfo(pAdapterInfo, &ulSizeAdapterInfo);
if (dwStatus == ERROR_BUFFER_OVERFLOW) {
// Allocate a buffer of the appropriate size
if (!(pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulSizeAdapterInfo))) {
printf("\n Insufficient Memory ");
return(1);
}
// Obtain the Adapter Info
dwStatus = GetAdaptersInfo(pAdapterInfo, &ulSizeAdapterInfo);
}
if (dwStatus != ERROR_SUCCESS) {
return(1);
} pOriginalPtr = pAdapterInfo; if (pAdapterInfo == NULL)
printf("\n No Interfaces Present.\n");
else
{
// Step through the adapter list
while (pAdapterInfo != NULL)
{
Print_IP_ADAPTER_INFO(pAdapterInfo);
pAdapterInfo = pAdapterInfo->Next;
}
}
return 0;
}void Print_IP_ADAPTER_INFO(IP_ADAPTER_INFO* pAdapterInfo)
{
if(pAdapterInfo==NULL)
return;
printf("\tAdapterName:%s\n",pAdapterInfo->AdapterName);
printf("\tDescription:%s\n",pAdapterInfo->Description);
printf("\tAddressLength:%d\n",pAdapterInfo->AddressLength);
printf("\tAdrress:");
for(int i=0 ; i< pAdapterInfo->AddressLength ; i++)
{
BYTE b=pAdapterInfo->Address[i];
printf("%02x",b);
}
printf("\n");
printf("\tAdapterIndex:%d\n",pAdapterInfo->Index);
printf("\tAdapter Type:");
switch(pAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER :
printf("MIB_IF_TYPE_OTHER \n");
break;
case MIB_IF_TYPE_ETHERNET :
printf("MIB_IF_TYPE_ETHERNET \n");
break;
case MIB_IF_TYPE_TOKENRING :
printf("MIB_IF_TYPE_TOKENRING \n");
break;
case MIB_IF_TYPE_FDDI :
printf("MIB_IF_TYPE_FDDI \n");
break;
case MIB_IF_TYPE_PPP :
printf("MIB_IF_TYPE_PPP \n");
break;
case MIB_IF_TYPE_LOOPBACK :
printf("MIB_IF_TYPE_LOOPBACK \n");
break;
case MIB_IF_TYPE_SLIP :
printf("MIB_IF_TYPE_SLIP \n");
break;
default:
printf("unknown\n");
break;
}
printf("\tDHCPEnabled:%d\n",pAdapterInfo->DhcpEnabled);
printf("\tCurrentIPAddress:");
Print_IP_ADDR_STRING(pAdapterInfo->CurrentIpAddress);
printf("\tIpAddressList:");
Print_IP_ADDR_STRING(&(pAdapterInfo->IpAddressList));
printf("\tGatewayList:");
Print_IP_ADDR_STRING(&(pAdapterInfo->GatewayList));
printf("\tDhcpServer:");
Print_IP_ADDR_STRING(&(pAdapterInfo->DhcpServer));
if(pAdapterInfo->HaveWins)
{
printf("\tHaveWins\n");
printf("\tPrimaryWinsServer:");
Print_IP_ADDR_STRING(&(pAdapterInfo->PrimaryWinsServer));
printf("\tSecondaryWinsServer:");
Print_IP_ADDR_STRING(&(pAdapterInfo->SecondaryWinsServer));
}
else
printf("\tHaveWins---FALSE\n");
printf("\n");
}
void Print_IP_ADDR_STRING(IP_ADDR_STRING* paddr)
{
if(paddr==NULL)
printf("\n");
while(paddr)
{
printf("IPAdress:%s,IPMask:%s,context:%d\n",paddr->IpAddress.String,paddr->IpMask.String,paddr->Context);
paddr=paddr->Next;
}
}
只不过不能直接看到对应什么网卡,只能给你一个网卡INDEX。
DWORD GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable,PULONG pdwSize,BOOL bOrder);
pipaddrtable先设为NULL,pdwsize=0.
这样先得到应该的dwsize,再new pipaddrtable.
然后再调用。border基本上没什么用,他问你要不要把结果排序pipaddrtable第一个数据成员就是一共多少个IP地址。(包括那个127.0.0.1)
后面是一个IP信息数组。
有IP地址(DWORD),MASK等等。
再转换
in_addr ia=...
masterz: GetAdaptersInfo()
matq2008: 注册表
sevencat: GetIpAddrTable()
再次感谢!