zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    mysql show的常见用法
    【转】在ubuntu下完美安装RTX(解决离线、乱码问题)(图片无法显示)
    bcdedit 替代easybcd 编辑grub
    Ruby学习札记(二)[数组]
    Ruby学习札记(一)常用数据
    [分布式]分布式锁
    移动docker数据文件到nas共享盘、释放C盘空间
    [分布式]分布式限流
    [分布式]分布式会话session、spring-session
    学习强国挑战答题学习资料
  • 原文地址:https://www.cnblogs.com/HsinTsao/p/6444110.html
Copyright © 2011-2022 走看看