• windows获取IP和MAC地址【Qt】



    1、根据hostname获取IP
    main.cpp:
    #include <QCoreApplication>
    #include"noarp.h"

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    char iname[128];
    hostent *host;

    //-----------初始化winsock---------------
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //--------------------------------------

    if(gethostname(iname,sizeof(iname))!=0){
    printf("hostname_Error:%d ",WSAGetLastError());
    exit(0);
    }
    host=gethostbyname(iname);
    printf("hostname:%s ",host->h_name);

    in_addr addr;
    for(int i=0;;i++){
    char * p=host->h_addr_list[i];
    if(p==NULL)
    break;
    memcpy(&addr.s_addr,p,host->h_length);
    }
    char *dip=inet_ntoa(addr);
    printf("IP:%s ",dip);

    return a.exec();
    }

    noarp.h:
    #ifndef NOARP_H
    #define NOARP_H

    #include<winsock2.h>
    #include<iphlpapi.h>
    #include<stdlib.h>
    #include<ws2tcpip.h>

    #endif // NOARP_H

    noarp.pro:
    #-------------------------------------------------
    #
    # Project created by QtCreator 2017-11-22T18:39:28
    #
    #-------------------------------------------------

    QT += core

    QT -= gui

    LIBS += -lpthread libwsock32 libws2_32
    LIBS += -lIphlpapi

    TARGET = noarp
    CONFIG += console
    CONFIG -= app_bundle

    TEMPLATE = app


    SOURCES += main.cpp

    HEADERS +=
    noarp.h


    注:
    1、Winsock是Windows下的网络编程接口,它是由Unix下的BSD Socket
    发展而来,是一个与网络协议无关的编程接口。
    2、hostent结构体
    struct hostent
    {
    char *h_name; //正式主机名
    char **h_aliases; //主机别名
    int h_addrtype; //主机IP地址类型:IPV4-AF_INET
    int h_length; //主机IP地址字节长度,对于IPv4是四字
    节,即32位
    char **h_addr_list; //主机的IP地址列表
    };

    #define h_addr h_addr_list[0] //保存的是IP地址
    3、动态链接库
    LIBS += -lpthread libwsock32 libws2_32
    LIBS += -lIphlpapi

    2、根据网卡获取IP和MAC
    main.cpp:
    #include <QCoreApplication>
    #include"noarp.h"

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    //-----------初始化winsock---------------
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //--------------------------------------

    PIP_ADAPTER_ADDRESSES pAddress=NULL;
    //PIP_ADAPTER_ADDRESSES是一个指针,所以声明时没有得到
    实际的存储空间,所以在下面要给其动态分配内存空间
    ULONG buflen=0;
    DWORD reCode=0;
    GetAdaptersAddresses(AF_UNSPEC,0,NULL,pAddress,&buflen);
    //GetAdaptersAddresses执行出错,作用是获取buflen的长度

    //printf("%d ",buflen);
    pAddress = (IP_ADAPTER_ADDRESSES*) malloc(buflen);

    if((reCode=GetAdaptersAddresses
    (AF_INET,0,NULL,pAddress,&buflen))!=NO_ERROR){
    printf("2no error ");exit(0);
    }

    while(pAddress!=NULL){
    PIP_ADAPTER_UNICAST_ADDRESS pUnicast=pAddress-
    >FirstUnicastAddress;

    for(int i=0;pUnicast!=NULL;i++){
    if(pUnicast->Address.lpSockaddr-
    >sa_family==AF_INET){
    sockaddr_in *sa_in=(sockaddr_in *)pUnicast-
    >Address.lpSockaddr;
    printf("IP:%s ",inet_ntoa(sa_in->sin_addr));
    }
    pUnicast=pUnicast->Next;
    }

    printf("MAC:%.2x-%.2x-%.2x-%.2x-%.2x-%.2x ",
    pAddress->PhysicalAddress[0],
    pAddress->PhysicalAddress[1],
    pAddress->PhysicalAddress[2],
    pAddress->PhysicalAddress[3],
    pAddress->PhysicalAddress[4],
    pAddress->PhysicalAddress[5]);

    pAddress=pAddress->Next;
    }

    return a.exec();
    }
    1)PIP_ADAPTER_ADDRESSES结构体
    typedef struct _IP_ADAPTER_ADDRESSES {
    union {
    ULONGLONG Alignment;
    struct {
    ULONG Length;
    DWORD IfIndex;
    };
    };
    struct _IP_ADAPTER_ADDRESSES *Next;
    PCHAR AdapterName;
    PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress;
    PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress;
    PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress;
    PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress;
    PWCHAR DnsSuffix;
    PWCHAR Description;
    PWCHAR FriendlyName;
    BYTE PhysicalAddress
    [MAX_ADAPTER_ADDRESS_LENGTH];
    DWORD PhysicalAddressLength;
    DWORD Flags;
    DWORD Mtu;
    DWORD IfType;
    IF_OPER_STATUS OperStatus;
    DWORD Ipv6IfIndex;
    DWORD ZoneIndices[16];
    PIP_ADAPTER_PREFIX FirstPrefix;
    ULONG64 TransmitLinkSpeed;
    ULONG64 ReceiveLinkSpeed;
    PIP_ADAPTER_WINS_SERVER_ADDRESS_LH FirstWinsServerAddress;
    PIP_ADAPTER_GATEWAY_ADDRESS_LH FirstGatewayAddress;
    ULONG Ipv4Metric;
    ULONG Ipv6Metric;
    IF_LUID Luid;
    SOCKET_ADDRESS Dhcpv4Server;
    NET_IF_COMPARTMENT_ID CompartmentId;
    NET_IF_NETWORK_GUID NetworkGuid;
    NET_IF_CONNECTION_TYPE ConnectionType;
    TUNNEL_TYPE TunnelType;
    SOCKET_ADDRESS Dhcpv6Server;
    BYTE Dhcpv6ClientDuid
    [MAX_DHCPV6_DUID_LENGTH];
    ULONG Dhcpv6ClientDuidLength;
    ULONG Dhcpv6Iaid;
    PIP_ADAPTER_DNS_SUFFIX FirstDnsSuffix;
    } IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES;
    2)*PIP_ADAPTER_UNICAST_ADDRESS结构体
    typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
    union {
    struct {
    ULONG Length;
    DWORD Flags;
    };
    };
    struct _IP_ADAPTER_UNICAST_ADDRESS *Next;
    SOCKET_ADDRESS Address;
    IP_PREFIX_ORIGIN PrefixOrigin;
    IP_SUFFIX_ORIGIN SuffixOrigin;
    IP_DAD_STATE DadState;
    ULONG ValidLifetime;
    ULONG PreferredLifetime;
    ULONG LeaseLifetime;
    UINT8 OnLinkPrefixLength;
    } IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;
    3)SOCKET_ADDRESS结构体
    typedef struct _SOCKET_ADDRESS {
    LPSOCKADDR lpSockaddr;
    INT iSockaddrLength;
    } SOCKET_ADDRESS, *PSOCKET_ADDRESS;
    4)sockaddr_in结构体
    struct sockaddr_in {
    short sin_family;
    u_short sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
    };

  • 相关阅读:
    Bundle类
    AlertDialog
    认识Android
    TextView属性详解
    Android中设置文字大小的定义类型
    理解偏差
    python爬虫实验2
    python爬虫实验
    PHP sql注入漏洞修复(字符串型)
    java实现远程控制
  • 原文地址:https://www.cnblogs.com/Mr-Wenyan/p/7882084.html
Copyright © 2020-2023  润新知