第一种方法,利用winsock函数来获取:
// GetIPMask.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <assert.h>
#include <stdio.h>
#pragma pack( push, 1 )
#define SIO_GET_INTERFACE_LIST 0x4004747F
typedef struct _sockaddr_gen
{
sockaddr_in AddressIn;
BYTE filler[8];
} sockaddr_gen;
typedef struct _INTERFACE_INFO
{
u_long iiFlags;
sockaddr_gen iiAddress;
sockaddr_gen iiBroadcastAddress;
sockaddr_gen iiNetmask;
} INTERFACE_INFO, *PINTERFACE_INFO;
#pragma pack( pop )
int main(int argc, char* argv[])
{
WSADATA bWsaData;
WORD wVerisionRequested;
SOCKET bSocket;
int iRetValue = 0;
INTERFACE_INFO bInterfaceInfo[10];
DWORD dlByteReturn = 0;
int iNumOfInterface = 0;
wVerisionRequested = MAKEWORD( 1, 1 );
WSAStartup( wVerisionRequested, &bWsaData );
bSocket = socket( AF_INET, SOCK_STREAM, 0 );
assert( INVALID_SOCKET != bSocket );
iRetValue = WSAIoctl( bSocket,
SIO_GET_INTERFACE_LIST,
NULL,
0,
bInterfaceInfo,
1024,
&dlByteReturn,
NULL,
NULL );
assert( SOCKET_ERROR != iRetValue );
iNumOfInterface = dlByteReturn / sizeof( INTERFACE_INFO );
for( int iX = 0; iX < iNumOfInterface; iX++ )
{
sockaddr_in pIPAddress;
sockaddr_in pMaskAddress;
sockaddr_in pBroadcastAddress;
char *pIPString;
char *pMaskString;
char *pBroadcastString;
pIPAddress = bInterfaceInfo[iX].iiAddress.AddressIn;
pIPString = inet_ntoa( pIPAddress.sin_addr );
printf("/t IP Address:/t %s/n", pIPString );
pMaskAddress = bInterfaceInfo[iX].iiNetmask.AddressIn;
pMaskString = inet_ntoa( pMaskAddress.sin_addr );
printf("/t MaskAddress:/t %s/n", pMaskString );
pBroadcastAddress = bInterfaceInfo[iX].iiBroadcastAddress.AddressIn;
pBroadcastString = inet_ntoa( pBroadcastAddress.sin_addr );
printf("/t BroadcastAddress:/t %s/n/n", pBroadcastString );
}
closesocket( bSocket );
WSACleanup();
return 0;
}
第二种方式,使用GetAdaptersInfo()函数来访问:
// GetNetAddress.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <Iphlpapi.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dlRetVal = 0;
pAdapterInfo = ( IP_ADAPTER_INFO *)malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutbufLen = sizeof(IP_ADAPTER_INFO);
if ( ERROR_BUFFER_OVERFLOW == GetAdaptersInfo( pAdapterInfo, &ulOutbufLen) )
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutbufLen);
}
dlRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutbufLen );
if ( NO_ERROR == dlRetVal )
{
pAdapter = pAdapterInfo;
while ( pAdapter )
{
printf("/tAdapter Name: /t%s/n", pAdapter->AdapterName);
printf("/tAdapter Desc: /t%s/n", pAdapter->Description);
printf("/tIP Address: /t%s/n", pAdapter->IpAddressList.IpAddress.String);
printf("/tIP Mask: /t%s/n", pAdapter->IpAddressList.IpMask.String);
pAdapter = pAdapter->Next;
}
}
getchar();
return 0;
}
其中第二种方法只适合于NT系统,也就是说在Windows 98下运行会出错.