问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何获取本机MAC地址 和 IP

发布网友 发布时间:2022-04-23 01:53

我来回答

2个回答

热心网友 时间:2022-05-11 06:00

1. 利用UUID获取
在Windows操作系统下,以Client-Sever模式进行通信时,运行时间库为了区分每个接口,需要为个接口建立一个UUID(Universally Unique Identifiers),在Windows95/98版本下,UUID的创建是通过调用函数UuidCreate()完成的,其中的第2至8字节包含了用户的MAC地址。因此,一种比较快的获取MAC地址的方法是创建一个UUID,然后分析UUID结构的第2至8字节,既可获取本机的MAC地址。示例程序如下:
static void GetMACaddress(void)
{
unsigned char MACData[6];
UUID uuid;
UuidCreate( &uuid ); // 要求操作系统创建一个新的UUID
for (int i=2; i<8; i++) // 获取本机MAC地址
MACData[i - 2] = uuid.Data4[i];
PrintMACaddress(MACData);
}
void PrintMACaddress(unsigned char MACData[])
{
printf("MAC Address: X-X-X-X-X-X\n",
MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);
}
这种方法只能用于Windows95/98操作系统。因为从安全的角度来看,在网络上散布本机的MAC地址存在着安全隐患,因此在Windows2000/xp操作系统中,微软对函数UuidCreate()进行了修正,使之在生成UUID时,不借助于本机的MAC地址。原来UuidCreate()完成的功能由函数UuidCreateSequential()完成。因此,如果在新的系统中采用这种方法,可用UuidCreateSequential()代替上述程序中的UuidCreate()函数。
另外,需要说明的是,这种方式只能用于单网卡主机。
2. 利用Net Bios协议获取
这种方法在Windows 95/98/Me/NT/2000/XP下都适用,不过它要求网卡必须安装正确,绑定了NetBios协议,并且机器正联接在一个运行正常的NetBios网络上。如果主机未接在网上,即使用网卡运行正常,运行下述代码,用户也不会得到任何信息。
static void GetMACaddress(void)
{
unsigned char MAC Data[8]; // 定义存放 MAC地址的缓冲区 (至少6字节)
WKSTA_TRANSPORT_INFO_0 *pwkti;
DWORD dwEntriesRead;
DWORD dwTotalEntries;
BYTE *pbBuffer;

// 通过 NetBIOS的枚举函数获取MAC地址
NET_API_STATUS dwStatus = NetWkstaTransportEnum(
NULL, // [input] 服务器名,0指本机
0, // [input] 0指函数返回指向WKSTA_TRANSPORT_INFO_0结构的指针
&pbBuffer, // [output] 指向缓冲区指针
MAX_PREFERRED_LENGTH, // [input] 缓冲区最大长度
&dwEntriesRead, // [output] 用于记录实际元素个数
&dwTotalEntries, //
NULL); //[input/output] 恢复句柄
assert(dwStatus == NERR_Success);
pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // 指针类型转换
for(DWORD i=0; i< dwEntriesRead; i++)
{ // 读取并打印MAC地址
swscanf((wchar_t *)pwkti[i].wkti0_transport_address,
L"%2hx%2hx%2hx%2hx%2hx%2hx",
&MACData[0],
&MACData[1],
&MACData[2],
&MACData[3],
&MACData[4],
&MACData[5]);
PrintMACaddress(MACData);
}
// 释放缓冲区
dwStatus = NetApiBufferFree(pbBuffer);
assert(dwStatus == NERR_Success);
}
3. 利用GetAdaptersInfo()函数获取
此方法利用了Windows SDK 中的函数GetAdaptersInfo(),对于用户来讲,编程很简单,而且适用于Windows 95/98/Me/NT/XP等操作系统,并且不要求主机必须接在网络上,要求的只有一点,就是网卡在Windows下必须是可用的。同时,需要说明的是,GetAdaptersInfo()是一个功能非常强大的函数,它不但可以得到本机的MAC地址,而且可以得到许多其它相关信息。详细内容可参见MSDN中有关IP_ADAPTER_INFO结构的说明。
static void GetMACaddress(void)
{
IP_ADAPTER_INFO AdapterInfo[16]; // 定义网卡信息存贮区。
DWORD dwBufLen = sizeof(AdapterInfo);
DWORD dwStatus = GetAdaptersInfo(
AdapterInfo, // [output] 指向接收数据缓冲指针
&dwBufLen); // [input] 缓冲区大小
assert(dwStatus == ERROR_SUCCESS); // 此处是个trap,用来保证返回值有效
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
do {
PrintMACaddress(pAdapterInfo->Address); // 打印MAC地址
pAdapterInfo = pAdapterInfo->Next;
}
while(pAdapterInfo);
}
本程序中定义了一个长度为16的IP_ADAPTER_INFO结构类型的数组,因此用户主机安装的网卡数不能超过16块,这在一般情况下都是可以满足的,如果出现超过16块的情况,用户需修改此项设置,或采用动态申请存贮空间的方式解决。
4.结束语
以上三种方法均在Visual C++ 6.0、Windows2000 环境下编译通过并工作正常。需要说明的是,示例程序只是提供了一种解决问题的思路,从软件工程的角度来看,有些不尽人意的地方,读者可以根据自己的编程需要进行修改。
5,获取IP
void CheckIP(void)
{
WSADATA wsaData;
char name[155];
char *ip;
PHOSTENT hostinfo;
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 ) {
if( gethostname ( name, sizeof(name)) == 0) {
if((hostinfo = gethostbyname(name)) != NULL) { //这些就是获得IP的函数
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
printf("%s\n",ip);
}
}
WSACleanup( );
} }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天将雄师观后感600字 为什么喝酒会降血糖 牛栏山 52度浓香型白酒-购买最佳价格 全兴大曲 52度浓香型白酒-购买最佳价格 笔记本电脑怎么接音箱电脑如何连接外置音箱 笔记本电脑有音箱插孔吗笔记本电脑如何连接喇叭 冰箱压缩机过热启动5秒就停了 周长相等的正方形和圆,其面积比是多少 周长相等的正方形和圆面积比是多少 周长相等的正方形与圆形,边长与半径的比是( ),面积之比是( )。 要有... win7旗舰版产品密钥是什么? 茄子饺子肉馅的做法是什么? 如何简化手机桌面? 营业执照添加了餐饮服务怎么才能让餐饮店的名字都在营业执照上 出现长上影线的K线是什么信号? 哪个桌面APP好用? 怎么获得MAC地址 底部放量上影线目的是什么 MAC地址申请有什么用?需要多久? 办理个体工商户营业执照名称怎么起 如何获得自己电脑的MAC地址?怎样修改? 有哪些好听的营业执照名字? 手机桌面是什么? windows7旗舰版产品密钥 阶段性高位放量长上影阴线,说明了什么? 我想办个营业执照,取什么名字好? 怎么调整手机桌面 如何快速选出有月线上影线,成交量放大的股票 如何把一寸照片背景由白底换成蓝底?急用 如何锻炼持久度? 个体户营业执照名字怎么起? 怎样设置静态路由信息?如何获得MAC地址?拜托各位大神 Windows 7 Ultimate 旗舰版 激活密钥: 放量带长上影线的小阳线说明了什么? 请问如何获得网关的正确MAC地址 和网卡的MAC地址? windows7旗舰版系统产品密钥 怎么彻底注销QQ账号? 什么是MAC地址、IP地址和ID? 营业执照的名称和店铺名称不一样可以吗? win7旗舰版要产品密钥怎么弄啊 怎样能够完全彻底的注销QQ号? 茄子猪肉馅饺子怎么做 怎样设置mac地址 我想开个小饭馆,申请营业执照填字号,店名必须和执照一样吗。 猪肉茄子馅饺子怎么做好吃,猪肉茄子馅饺 营业执照可以改名字吗 需要什么手续 我这儿是一家小餐馆的营业执照 拜托大神们有没有知道的 茄子馅肉儿饺子怎么做 手机怎样下载东西到u盘? 想开个快餐店,营业执照怎么弄?要什么证件才能开? 茄子大肉饺子的做法,茄子大肉饺子怎么做好吃