如何直接读取网卡的MAC地址,用PB或用VC写段代码来看看!

sanshui_yangfei 2003-03-18 04:26:48
加精
不胜感激!
...全文
275 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingzai 2003-03-24
  • 打赏
  • 举报
回复
You can find iphlpapi.h at http://www.lastbit.com/trafmeter/iphlpapi.zip
sanshui_yangfei 2003-03-24
  • 打赏
  • 举报
回复
在线等待!
sanshui_yangfei 2003-03-24
  • 打赏
  • 举报
回复
lovelygirl11(范冰冰),你这个程序是不是一定要绑定netbios才能用,但是我们单位绝大部门机器是没有这个协议的,有没有其他办法!
我看前面几位朋友都使用了iphlpapi.dll这个动态库,但是我怎么也找不到这个库的头文件iphlpapi.h,在http://www.madwizard.org/view.php?page=downloads里也只能下到dll和lib,哪位寄一个头文件给我,不胜感激!我的email:sanshui_yangfei@163.com.谢谢!
lovelygirl11 2003-03-21
  • 打赏
  • 举报
回复
在实际的应用系统中,我们往往会需要在程序运行时获取当前机器的网卡的MAC地址,以便作为某种标识之用,如控制程序的合法性等。下文介绍如何用Microsoft VisualC++ 6.0开发这样的程序。

这里采用的方法是通过Windows 9x/NT/Win2000中内置的NetApi32.DLL的功能来实现的。首先通过发送NCBENUM命令,获取网卡的数目和每张网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。注意:这里的网卡是指捆绑了NetBEIU协议的通信协议栈,可以在网卡的属性处查看到。

请运行VC++,打开一个新的工程,选择创建一个Win32 Console程序,然后按下文输入代码,并请参见其中的注释:

#include "stdafx.h"

#include <windows.h>

#include <wincon.h>

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

// 因为是通过NetAPI来获取网卡信息,所以需要包含其题头文件nb30.h

#include <nb30.h>

typedef struct _ASTAT_

{

ADAPTER_STATUS adapt;

NAME_BUFFER

NameBuff [30];

} ASTAT, * PASTAT;

ASTAT Adapter;

// 定义一个存放返回网卡信息的变量

// 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的

void getmac_one (int lana_num)

{

NCB ncb;

UCHAR uRetCode;

memset( &ncb, 0, sizeof(ncb) );

ncb.ncb_command = NCBRESET;

ncb.ncb_lana_num = lana_num // 指定网卡号

// 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化

uRetCode = Netbios( &ncb );

printf( "The NCBRESET return code is: 0x%x \n", uRetCode );

memset( &ncb, 0, sizeof(ncb) );

ncb.ncb_command = NCBASTAT;

ncb.ncb_lana_num = lana_num; // 指定网卡号

strcpy((char *)ncb.ncb_callname,"*" );

ncb.ncb_buffer = (unsigned char *) &Adapter; // 指定返回的信息存放的变量

ncb.ncb_length = sizeof(Adapter);

// 接着,可以发送NCBASTAT命令以获取网卡的信息

uRetCode = Netbios( &ncb );

printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );

if ( uRetCode == 0 )

{

// 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802

printf( "The Ethernet Number[%d] is: %02X%02X-%02X%02X-%02X%02X\n",

lana_num,

Adapter.adapt.adapter_address[0],

Adapter.adapt.adapter_address[1],

Adapter.adapt.adapter_address[2],

Adapter.adapt.adapter_address[3],

Adapter.adapt.adapter_address[4],

Adapter.adapt.adapter_address[5] );

}

}

int main(int argc, char* argv[])

{

NCB ncb;

UCHAR uRetCode;

LANA_ENUM lana_enum;

memset( &ncb, 0, sizeof(ncb) );

ncb.ncb_command = NCBENUM;

ncb.ncb_buffer = (unsigned char *) &lana_enum;

ncb.ncb_length = sizeof(lana_enum);

// 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等

uRetCode = Netbios( &ncb );

printf( "The NCBENUM return code is: 0x%x \n", uRetCode );

if ( uRetCode == 0 )

{

printf( "Ethernet Count is : %d\n\n", lana_enum.length);

// 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址

for ( int i=0; i<lana_enum.length; ++i)

getmac_one( lana_enum.lana[i]);

}

return 0;

}

此时,按F7编译,按F5运行即可。

这段代码可以直接嵌入相关的应用系统之中,或封装成.DLL或COM控件,以便可以在Visual Basic、Visual Foxpro、Power Builder或Delphi等其他程序中调用。

kingzai 2003-03-21
  • 打赏
  • 举报
回复
http://www.madwizard.org/view.php?page=downloads
sanshui_yangfei 2003-03-20
  • 打赏
  • 举报
回复
有没有PB代码的或者给各DLL文件
sanshui_yangfei 2003-03-20
  • 打赏
  • 举报
回复
什么网址?
sanshui_yangfei 2003-03-20
  • 打赏
  • 举报
回复
有的话请给我一个!sanshui_yangfei@163.com
kingzai 2003-03-20
  • 打赏
  • 举报
回复
download platform sdk from microsoft
sanshui_yangfei 2003-03-20
  • 打赏
  • 举报
回复
哪里有iphlpapi.h文件下载
lastcsdn2166 2003-03-20
  • 打赏
  • 举报
回复
http://www.codeguru.com/network/GetMAC.html
walkonthesky 2003-03-20
  • 打赏
  • 举报
回复
其实还有更简单的
到注册表里面去找

更简单
kingzai 2003-03-19
  • 打赏
  • 举报
回复
Works on the network that I tried (I took out the network address I
used):
// Note: Win2000 only
// NOT NT 4.0, Win9x, WinME

#pragma comment( lib, "Iphlpapi" )
#pragma comment( lib, "Ws2_32" )

#include <windows.h>
#include <Iphlpapi.h>

int main( ) {

IPAddr ip = 0;
ULONG mac = 0;
DWORD error = 0;

DWORD dwSize = sizeof( ULONG) ;
ip = inet_addr("192.168.0.100");
//ip = inet_addr("xxx.xxx.xxx.xxx");
error = SendARP(ip,0,&mac,&dwSize);

return 0;
}
sanshui_yangfei 2003-03-19
  • 打赏
  • 举报
回复
我找不到Iphlpapi.h这个文件。
Happy197212 2003-03-19
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;
#define bzero(thing,sz) memset(thing,0,sz)

bool GetAdapterInfo(int adapter_num, string &mac_addr)
{
// Reset the LAN adapter so that we can begin querying it
NCB Ncb;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = adapter_num;
if (Netbios(&Ncb) != NRC_GOODRET) {
mac_addr = "bad (NCBRESET): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}

// Prepare to get the adapter status block
bzero(&Ncb,sizeof(Ncb);
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = adapter_num;
strcpy((char *) Ncb.ncb_callname, "*");
struct ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} Adapter;
bzero(&Adapter,sizeof(Adapter));
Ncb.ncb_buffer = (unsigned char *)&Adapter;
Ncb.ncb_length = sizeof(Adapter);

// Get the adapter's info and, if this works, return it in standard,
// colon-delimited form.
if (Netbios(&Ncb) == 0)
{
char acMAC[18];
sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
int (Adapter.adapt.adapter_address[0]),
int (Adapter.adapt.adapter_address[1]),
int (Adapter.adapt.adapter_address[2]),
int (Adapter.adapt.adapter_address[3]),
int (Adapter.adapt.adapter_address[4]),
int (Adapter.adapt.adapter_address[5]));
mac_addr = acMAC;
return true;
}
else
{
mac_addr = "bad (NCBASTAT): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}
}

int main()
{
// Get adapter list
LANA_ENUM AdapterList;
NCB Ncb;
memset(&Ncb, 0, sizeof(NCB));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (unsigned char *)&AdapterList;
Ncb.ncb_length = sizeof(AdapterList);
Netbios(&Ncb);

// Get all of the local ethernet addresses
string mac_addr;
for (int i = 0; i < AdapterList.length - 1; ++i)
{
if (GetAdapterInfo(AdapterList.lana[i], mac_addr))
{
cout << "Adapter " << int (AdapterList.lana[i]) <<
"'s MAC is " << mac_addr << endl;
}
else
{
cerr << "Failed to get MAC address! Do you" << endl;
cerr << "have the NetBIOS protocol installed?" << endl;
break;
}
}

return 0;
}

aright 2003-03-18
  • 打赏
  • 举报
回复
上面那个代码可以获得第一块卡的 MAC[6]
aright 2003-03-18
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
#include <Iphlpapi.h> // link iphlpapi.lib
//---------------------------------------------------------------------------
int getMAC_from_IPFUNC( char MAC[] )
{
unsigned long bsize = 20*sizeof(IP_ADAPTER_INFO);
char buf[20*sizeof(IP_ADAPTER_INFO)] ;
DWORD gm=GetAdaptersInfo( (PIP_ADAPTER_INFO )buf, &bsize );
if( gm == ERROR_SUCCESS )
{
PIP_ADAPTER_INFO a = (PIP_ADAPTER_INFO )buf ;
memcpy( MAC, a->Address, 6 );
return 1 ;
}
return 0;
}

4,354

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧