您的位置:首页 > 理论基础

如何获取本地计算机的IP,子网掩码

2008-03-06 22:02 405 查看
第一种方法,利用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下运行会出错. 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息