取得mac地址 我想提两个问题,第一个问题很急一:在给定局域网内某台机器的ip后,怎么得到它的mac地址?(哪个函数api)二:怎么知道所有能连通机器的ip地址?多谢了,我刚接触网络编程 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先在头文件定义中加入#include "nb30.h"#pragma comment(lib,"netapi32.lib")typedef struct _ASTAT_{ ADAPTER_STATUS adapt; NAME_BUFFER NameBuff[30];} ASTAT, * PASTAT;就可以这样调用来获取远程网卡MAC地址了:CString GetMacAddress(CString sNetBiosName){ ASTAT Adapter; NCB ncb; UCHAR uRetCode; memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = 0; uRetCode = Netbios(&ncb); memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = 0; sNetBiosName.MakeUpper(); FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20); strcpy((char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName); ncb.ncb_callname[sNetBiosName.GetLength()] = 0x20; ncb.ncb_callname[NCBNAMSZ] = 0x0; ncb.ncb_buffer = (unsigned char *) &Adapter; ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios(&ncb); CString sMacAddress; if (uRetCode == 0) { sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"), 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]); } return sMacAddress;} #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 returncode 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;} http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=905查看网络设置的源代码 该代码可以查询如下信息:IP地址,子网掩码,MAC地址,网关,DHCP,Wins服务器 绘菜单与主菜单栏一起绘制 开发一个翻页的效果 关于注释的问题 关于多线程的问题! 如何在VC中的一个主窗体中的一个按键启动另一个窗体 怎么这样换鼠标图像没有作用啊? 连接MySQL必须要启动MySQL的服务器程序吗,能不能像Access一样打开一个数据库文件? 奇怪!!程序在DEBUG和RELEASE下都可以编译通过,但是 dll基本概念问题! 在WINDOWS2000中如何调用函数使其关机AND重新启动! 请问用WINCAP捕获的数据包怎么写成文件让sniffer能打开,也就是说sniffer的文件格式是什么样的? 菜鸟的一个小问题,请高手指点一下!很简单的,谢谢!
#pragma comment(lib,"netapi32.lib")
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT, * PASTAT;就可以这样调用来获取远程网卡MAC地址了:
CString GetMacAddress(CString sNetBiosName)
{
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios(&ncb);
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
sNetBiosName.MakeUpper();
FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20);
strcpy((char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName);
ncb.ncb_callname[sNetBiosName.GetLength()] = 0x20;
ncb.ncb_callname[NCBNAMSZ] = 0x0;
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
CString sMacAddress;
if (uRetCode == 0)
{
sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"),
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]);
}
return sMacAddress;
}
#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;
}
查看网络设置的源代码 该代码可以查询如下信息:
IP地址,子网掩码,MAC地址,网关,DHCP,Wins服务器