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\n",WSAGetLastError());
exit(0);
}
host=gethostbyname(iname);
printf("hostname:%s\n",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\n\n\n",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\n",buflen);
pAddress = (IP_ADAPTER_ADDRESSES*) malloc(buflen);

if((reCode=GetAdaptersAddresses
(AF_INET,0,NULL,pAddress,&buflen))!=NO_ERROR){
printf("2no error\n");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\t",inet_ntoa(sa_in->sin_addr));
}
pUnicast=pUnicast->Next;
}

printf("MAC:%.2x-%.2x-%.2x-%.2x-%.2x-%.2x\n",
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];
};

转载于:https://www.cnblogs.com/Mr-Wenyan/p/7882084.html

windows获取IP和MAC地址【Qt】相关推荐

  1. Windows获取本机MAC地址方法(C语言)

    Windows获取本机MAC地址方法(C语言) 用到的方法有两种:Netbios()和GetAdaptersInfo(); Netbios 获取步骤主要分为三步: 一.枚举本机所有LAN 二.重设每个 ...

  2. 用nmap获取ip和mac地址

    在windows下有lansee和Advanced IP scanner来查找IP和对应的MAC地址,在ubuntu中,好用的工具似乎不多,nmap命令行工具倒是提供了强大的功能. 可以使用命令来获取 ...

  3. php 获取ip mac,php获取IP、MAC地址函数

    参数$AiType取值:1:IP,2:MAC,3:IP+MAC 返回 return string:地址串 function GetClientAddr($AiType=0) { $sMac = &qu ...

  4. windows下获取IP和MAC地址

    1.定义数据结构 //一个网卡可能有多个IP地址 typedef struct s_ip_fname {std::vector<std::string> ips;std::string m ...

  5. Android 获取IP与mac地址

    没什么好说的,直接上java代码 import java.net.NetworkInterface; import java.util.ArrayList; import java.util.Coll ...

  6. Qt获取本机IP、MAC地址、子网掩码、网卡名等函数设计

    获取本机IP函数 QString getIp() {QString myIp;QList<QHostAddress> ipList = QNetworkInterface::allAddr ...

  7. android 获取mac c语言,获取设备的mac地址和IP地址(android6.0以上专用)

    /** * 获取设备HardwareAddress地址 * @return */ public static String getMachineHardwareAddress(){ Enumerati ...

  8. python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例

    这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...

  9. android 获取网卡mac_Android获取本机Mac地址及IP地址方法

    1.Android  获取本机Mac 地址方法: 需要在AndroidManifest.xml文件中添加权限: public String getLocalMacAddress() { WifiMan ...

最新文章

  1. hihoCoder 1549 或运算和
  2. 二十九、Pyspider爬取v2Ex网的python帖子
  3. java私有属性和私有方法_Java私有,受保护,公共和默认
  4. Must be between v0 and v15, inclusive解决办法
  5. cesium3dtiles位置改变
  6. 中小企业上云多地域办公组网(SAG)解决方案
  7. mysql之查询排序
  8. 从C#中通过Windows窗体添加信息到数据库 (添加学生信息)
  9. 【原】数据分析/数据挖掘 入门级选手建议
  10. python解析XML:之二 (ElementTree)
  11. Ubuntu18.04找不到wifi适配器解决办法以及怎么上网
  12. 软件设计师考试历年试题汇总
  13. adf4351_Oracle ADF和Oracle Jet一起工作。 建筑模式
  14. JavaScript设计模式:四、发布订阅模式
  15. 我的故事登上了Android开发者的官网
  16. 辛意云教授讲《论语》
  17. 输入N,打印对应N行的图案。
  18. 如何将一个vector内容赋值给另一个vector C/C++
  19. SpringCloud(八) 微服务安全实战 Prometheus配置grafana可见性监控,ELK日志,pinpoint追踪(Tracing,Metrics,Logging)
  20. 如何离线下载网易云音乐

热门文章

  1. php拿站,从建站到拿站
  2. 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异
  3. hibernate实战第二版 蒲成带目录_太NB了! 阿里程序员带你玩转Spring:脑图+实战五+面试百问+知识总结...
  4. Docker 入门尝鲜
  5. 判断textarea是否超过行数限制
  6. Web前端笔记-圆环随时间逐渐缩小(使用two.js)
  7. Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
  8. Qt学习笔记-基于QGraphicsScene的打地鼠游戏
  9. java中截取部分字符串_JAVA中截取字符串substring用法详解
  10. 官网下载的mysql密码忘了怎么办_MySQL密码忘了怎么办?MySQL重置root密码方法