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\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】相关推荐
- Windows获取本机MAC地址方法(C语言)
Windows获取本机MAC地址方法(C语言) 用到的方法有两种:Netbios()和GetAdaptersInfo(); Netbios 获取步骤主要分为三步: 一.枚举本机所有LAN 二.重设每个 ...
- 用nmap获取ip和mac地址
在windows下有lansee和Advanced IP scanner来查找IP和对应的MAC地址,在ubuntu中,好用的工具似乎不多,nmap命令行工具倒是提供了强大的功能. 可以使用命令来获取 ...
- php 获取ip mac,php获取IP、MAC地址函数
参数$AiType取值:1:IP,2:MAC,3:IP+MAC 返回 return string:地址串 function GetClientAddr($AiType=0) { $sMac = &qu ...
- windows下获取IP和MAC地址
1.定义数据结构 //一个网卡可能有多个IP地址 typedef struct s_ip_fname {std::vector<std::string> ips;std::string m ...
- Android 获取IP与mac地址
没什么好说的,直接上java代码 import java.net.NetworkInterface; import java.util.ArrayList; import java.util.Coll ...
- Qt获取本机IP、MAC地址、子网掩码、网卡名等函数设计
获取本机IP函数 QString getIp() {QString myIp;QList<QHostAddress> ipList = QNetworkInterface::allAddr ...
- android 获取mac c语言,获取设备的mac地址和IP地址(android6.0以上专用)
/** * 获取设备HardwareAddress地址 * @return */ public static String getMachineHardwareAddress(){ Enumerati ...
- python获取mac、计算机id_python 获取本机IP、mac地址、计算机名的简单示例
这篇文章主要为大家详细介绍了python 获取本机IP.mac地址.计算机名的简单示例,具有一定的参考价值,可以用来参考一下. 对python获取本机IP.mac地址.计算机名感兴趣的小伙伴,下面一起 ...
- android 获取网卡mac_Android获取本机Mac地址及IP地址方法
1.Android 获取本机Mac 地址方法: 需要在AndroidManifest.xml文件中添加权限: public String getLocalMacAddress() { WifiMan ...
最新文章
- hihoCoder 1549 或运算和
- 二十九、Pyspider爬取v2Ex网的python帖子
- java私有属性和私有方法_Java私有,受保护,公共和默认
- Must be between v0 and v15, inclusive解决办法
- cesium3dtiles位置改变
- 中小企业上云多地域办公组网(SAG)解决方案
- mysql之查询排序
- 从C#中通过Windows窗体添加信息到数据库 (添加学生信息)
- 【原】数据分析/数据挖掘 入门级选手建议
- python解析XML:之二 (ElementTree)
- Ubuntu18.04找不到wifi适配器解决办法以及怎么上网
- 软件设计师考试历年试题汇总
- adf4351_Oracle ADF和Oracle Jet一起工作。 建筑模式
- JavaScript设计模式:四、发布订阅模式
- 我的故事登上了Android开发者的官网
- 辛意云教授讲《论语》
- 输入N,打印对应N行的图案。
- 如何将一个vector内容赋值给另一个vector C/C++
- SpringCloud(八) 微服务安全实战 Prometheus配置grafana可见性监控,ELK日志,pinpoint追踪(Tracing,Metrics,Logging)
- 如何离线下载网易云音乐
热门文章
- php拿站,从建站到拿站
- 三维坐标系带偏航角俯仰角_浅谈三维旋转的三种方法及差异
- hibernate实战第二版 蒲成带目录_太NB了! 阿里程序员带你玩转Spring:脑图+实战五+面试百问+知识总结...
- Docker 入门尝鲜
- 判断textarea是否超过行数限制
- Web前端笔记-圆环随时间逐渐缩小(使用two.js)
- Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
- Qt学习笔记-基于QGraphicsScene的打地鼠游戏
- java中截取部分字符串_JAVA中截取字符串substring用法详解
- 官网下载的mysql密码忘了怎么办_MySQL密码忘了怎么办?MySQL重置root密码方法