|
发表于 2010-6-2 18:50:46
|
显示全部楼层
另一个方法可以用这个,我也是在网上查的:
原贴地址:http://hi.baidu.com/isbx/blog/item/7fcd5d60d78da1da8cb10d4c.html
VC下获得网卡MAC,IP等信息的最简单方法
2008-07-15 13:51
今天闲着无聊就想来做点试验,于是想到获得网卡的一些信息,开始网上狂搜,找到的方法都很麻烦,后来在一个Delphi技术网站发现一个简单方法,于是我将他代码翻译了一下,加入了一些其他的功能(他程序主要是获得MAC).下面详细介绍下方法.获得MAC:网上很多都是获得网卡信息然后在获得MAC,或者从注册表里读,不过这里介绍一个简单的方法用到一个API
RPC_STATUS RPC_ENTRY UuidCreateSequential(UUID* Uuid);
这个API可以获得MAC地址
他返回信息如下
RPC_S_OK The call succeeded.
RPC_S_UUID_LOCAL_ONLY The UUID is guaranteed to be unique to this computer only.
RPC_S_UUID_NO_ADDRESS Cannot get Ethernet or token-ring hardware address for this computer.
正常返回是第一个 所以我们用下面的代码获得到MAC地址long rt;
UUID ui;
char mac[6][10]={0};
CString temp;
CString Mac;
rt = UuidCreateSequential(&ui);
if (rt == RPC_S_OK)
{
_itoa(ui.Data4[2],mac[0],16);
_itoa(ui.Data4[3],mac[1],16);
_itoa(ui.Data4[4],mac[2],16);
_itoa(ui.Data4[5],mac[3],16);
_itoa(ui.Data4[6],mac[4],16);
_itoa(ui.Data4[7],mac[5],16);
}
for(int n=0;n<6;n++)
{
if (strlen(mac[n]) == 1)
{
temp.Format("0%s",mac[n]);
strcpy(mac[n],temp);
}
}
Mac.Format("%s.%s.%s.%s.%s.%s",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
SetDlgItemText(IDC_EDIT1,Mac); 这样就完成了第一个获得到MAC地址,至于为什么要循环一次是因为转成16进制以后是一位比如0.0.0.0.0.0但是MAC地址一般是16进制,所以是00所以加个0而已00.00.00.00.00.00下面是获得IP和主机名char name[255]={0};
CString ip;
hostent *addr;
::AfxSocketInit();
if(gethostname(name,sizeof(name))==0)
{
if((addr=gethostbyname(name)) != NULL)
{
ip = inet_ntoa(*(in_addr*)*addr->h_addr_list);
}
}
SetDlgItemText(IDC_EDIT2,name);
SetDlgItemText(IDC_IPADDRESS1,ip); 这个原理很简单先获得主机名,然后通过主机名获得到对应的IP.
需要注意的是,开始需要引用
#i nclude <afxsock.h>
这样才可以正常获得主机名,
至于MAC需要使用到
Rpcrt4.dll
这个文件(系统目录下)
所以需要引用库和头文件
#i nclude "Rpcdce.h"
#pragma comment(lib,"Rpcrt4.lib")
这样这个最简单的获得MAC和IP以及主机名的程序就完成了.
|
|
|