怎样读取网卡的MAC地址?
问题点数:98、回复次数:4Top
1 楼Jneu(沧海桑田)回复于 2002-01-29 18:13:55 得分 98
#include “stdafx.h"
#include
#include
#include
#include
#include
// 因 为 是 通 过NetAPI 来 获 取 网 卡 信 息,
所 以 需 要 包 含 其 题 头 文 件nb30.h
#include
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 地 址
Top
2 楼wwwsq(wwwsq)回复于 2002-01-29 18:43:15 得分 0
这是msdn上的标准示例演变出来的简化版
用这个方法可以获得所有网卡上的mac地址
in .h:
#include <Wsnwlink.h> // about ipx
#include "wsipx.h"
sockaddr_ipx m_ipxAddr;
in .cpp:
//获得本机IPX地址
SOCKET s;
SOCKADDR_IPX Addr;
int res = 0, cbOpt = 0, cbAddr = sizeof(SOCKADDR_IPX);
s = socket( AF_IPX, SOCK_DGRAM, NSPROTO_IPX );
if(s==INVALID_SOCKET)
printf("Error: %u\n", WSAGetLastError());
memset( &Addr, 0, sizeof( Addr ));
Addr.sa_family = AF_IPX;
res = bind( s, (SOCKADDR*) &Addr, cbAddr);
if(res != 0)
{
printf("Error: %u\n", WSAGetLastError());
closesocket(s);
return;
}
IPX_ADDRESS_DATA IpxData;
memset( &IpxData, 0, sizeof(IpxData));
IpxData.adapternum = 0; // 只监听第一块网卡
cbOpt = sizeof( IpxData );
if((res = getsockopt( s, NSPROTO_IPX, IPX_ADDRESS, (char*) &IpxData, &cbOpt)) != 0)
{
printf("Error: %u\n", WSAGetLastError());
closesocket(s);
return;
}
this->m_ipxAddr.sa_family = AF_IPX;
memcpy(this->m_ipxAddr.sa_netnum, IpxData.netnum, sizeof(IpxData.netnum));
memcpy(this->m_ipxAddr.sa_nodenum, IpxData.nodenum, sizeof(IpxData.nodenum));
this->m_ipxAddr.sa_socket = 14555;
closesocket(s);
Top
3 楼wwwsq(wwwsq)回复于 2002-01-29 18:47:06 得分 0
还有一个类似的方法,可以调用getsockname得到mac地址,更简单
SOCKET SrvSock;
PSOCKADDR_IPX pSockAddr;
struct sockaddr addr;
SrvSock = socket(AF_IPX, // IPX Family
SOCK_SEQPACKET, // Gives message mode transfers
NSPROTO_SPX); // SPX is connection oriented transport
if(SrvSock == INVALID_SOCKET)
{
return FALSE;
}
memset(&addr, 0, sizeof(addr)); // Clear address
pSockAddr = (PSOCKADDR_IPX)&addr; // Set pointer
pSockAddr->sa_family = AF_IPX;
if(bind(SrvSock, (PSOCKADDR) pSockAddr, sizeof(SOCKADDR_IPX)) == SOCKET_ERROR)
{
return FALSE;
}
int addrlen = sizeof(addr);
if(getsockname(SrvSock,&addr,&addrlen) == SOCKET_ERROR)
{
return FALSE;
}
memcpy(g_netnum, addr.sa_data, sizeof(g_netnum));
memcpy(g_netnod, addr.sa_data + sizeof(g_netnum), sizeof(g_netnod));
Top
4 楼kissfire(kissfire)回复于 2002-01-30 22:01:25 得分 0
iseeTop




