GetIPAddress——獲得本地IP地址信息


 

1.gethostname()需要初始化套接字庫 加載#pragma comment(lib,"ws2_32.lib"),和WSAStartup(MAKEWORD(2,2),&wsaData)函數

2.IP_ADAPTER_INFO結構包含了網絡適配器的信息

typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next; //指向下一個適配器
DWORD ComboIndex; //保留字段
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; //適配器名稱
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; //對適配器的描述
UINT AddressLength; //MAC地址的長度(6字節)
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //MAC地址
DWORD Index; //適配器索引
UINT Type; //適配器類型
UINT DhcpEnabled; //指定此適配是否有效了DHCP(動態主機配置)協議
PIP_ADDR_STRING CurrentIpAddress; //保留字段
IP_ADDR_STRING IpAddressList; //與此適配器相關的ip列表
IP_ADDR_STRING GatewayList; //網關地址列表
IP_ADDR_STRING DhcpServer; //DHCP服務器
BOOL HaveWins; //指定此適配器是否使用WINS(Windows Internet名稱服務)
IP_ADDR_STRING PrimaryWinsServer; //WINS服務器的主IP
IP_ADDR_STRING SecondaryWinsServer; //第二IP
time_t LeaseObtained; //當前DHCP租用時間
time_t LeaseExpires; //當前DHCP租用期滿的時間
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

 

3.獲取本地機器的適配器信息

GetAdaptersInfo(
__out_bcount_opt(*SizePointer) PIP_ADAPTER_INFO AdapterInfo, //指向一個緩沖區用來存放IP_ADAPTER_INFO列表
__inout PULONG SizePointer //指定上方緩沖區的大小,不夠則返回需要的大小
); //此函數調用成功返回ERROR_SUCCESS

 

實現代碼

#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include "Iphlpapi.h"
#include <stdio.h>
#include <iostream>

#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "WS2_32.lib")


#pragma comment(lib,"ws2_32.lib")    
using namespace std;

BOOL InitSock();
BOOL GetAllIp();
BOOL GetGlobalData();


// 全局數據
u_char    g_ucLocalMac[6];           // 本地MAC地址
DWORD    g_dwGatewayIP;        // 網關IP地址
DWORD    g_dwLocalIP;               // 本地IP地址
DWORD    g_dwMask;            // 子網掩碼

void main()
{
    InitSock();
    GetAllIp();
    GetGlobalData();
}

BOOL InitSock()
{
    WSAData wsaData = {0};
    if(WSAStartup(MAKEWORD(2,2),&wsaData)==0)
    {
        return TRUE;
    }

    return FALSE;
}


BOOL GetAllIp()
{
    char szHost[256] = {0};
    gethostname(szHost,256);//獲取本地主機名     

    HOSTENT *pHost = gethostbyname(szHost);//通過主機名過得地址信息
    if (szHost==NULL)  //打印出所有IP地址
    {  
        cout<<"error"<<endl;  
    } 
    in_addr addr;
    for(int i = 0; ;i++)
    {
        char *p = pHost->h_addr_list[i];
        if(p == NULL)
            break;

        memcpy(&addr.S_un.S_addr,p,pHost->h_length);
        char *szIP = inet_ntoa(addr);
        cout<<"The LocalAddress:"<<szIP<<endl;
    }

    /*char ip[256] = {0};
    strcpy(ip,inet_ntoa(*(in_addr*)*pHost->h_addr_list));


    cout<<"The LocalAddress:"<<ip<<endl;*/
    system("PAUSE");
    return TRUE;

}



BOOL GetGlobalData()
{
    PIP_ADAPTER_INFO pAdapterInfo = NULL; 
    ULONG ulLen = 0;

    // 為適配器結構申請內存
    GetAdaptersInfo(pAdapterInfo,&ulLen);
    pAdapterInfo = (PIP_ADAPTER_INFO)::GlobalAlloc(GPTR, ulLen);

    // 取得本地適配器結構信息

        if(::GetAdaptersInfo(pAdapterInfo,&ulLen) ==  ERROR_SUCCESS)
        {
        if(pAdapterInfo != NULL)
            {
                for(pAdapterInfo = pAdapterInfo;pAdapterInfo != NULL;pAdapterInfo = pAdapterInfo->Next)
                {
                memcpy(g_ucLocalMac, pAdapterInfo->Address, 6);
                g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
                g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
                g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String);

                printf(" \n -------------------- 本地主機信息 -----------------------\n\n");
    in_addr in;
    in.S_un.S_addr = g_dwLocalIP;
    printf("      IP Address : %s \n", ::inet_ntoa(in));

    in.S_un.S_addr = g_dwMask;
    printf("     Subnet Mask : %s \n", ::inet_ntoa(in));

    in.S_un.S_addr = g_dwGatewayIP;
    printf(" Default Gateway : %s \n", ::inet_ntoa(in));

    u_char *p = g_ucLocalMac;
    printf("     MAC Address : %02X-%02X-%02X-%02X-%02X-%02X \n", p[0], p[1], p[2], p[3], p[4], p[5]);

    printf(" \n \n ");
    pAdapterInfo = pAdapterInfo->Next ;
            }
        }

    
    
    }

    getchar();

    return TRUE;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM