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(" 
 -------------------- 本地主机信息 -----------------------

");
    in_addr in;
    in.S_un.S_addr = g_dwLocalIP;
    printf("      IP Address : %s 
", ::inet_ntoa(in));

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

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

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

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

    
    
    }

    getchar();

    return TRUE;
}
原文地址:https://www.cnblogs.com/HsinTsao/p/6444110.html