获取远程主机MAC地址的问题

lgh21cn 2004-11-16 04:18:40
本人需要根据IP/主机名称通过NetBIOS获得远程主机MAC地址,查询了MSDN和网络上的资料,基本上都是如下的程序
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;
}
我编译运行后,根本得不到MAC地址,调试跟踪后发现最后一个uRetCode = Netbios(&ncb);返回的值为0x35,nb30.h内的解释是“required OS resources exhausted”。
请问各位高手,造成这个结果的原因是什么?应该怎么解决? 谢谢!!!
...全文
454 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgh21cn 2004-11-18
  • 打赏
  • 举报
回复
非常感谢各位!!! 通过努力,根据MSDN的说明,这个问题已经得到解决,MSDN和网上资料介绍的方法有不妥的地方(至少是在我的开发环境中),通过修改原代码已成功得到MAC地址。
oyljerry 2004-11-17
  • 打赏
  • 举报
回复
检查端口是否开放,目标机器防火墙是否允许
gdy119 2004-11-17
  • 打赏
  • 举报
回复
win+r services.msc--- TCP/IP NetBIOS Helper Service(start???)
//mac---------------------------------------------------------
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2,2), &wsaData);
if ( iRet != 0 )
{
printf( "WSAStartup Error:%d\n", GetLastError() );
exit( 0 );
}
CString ip("192.168.8.16");
CString strRet;
strRet.Empty();
ULONG ulIP = inet_addr(ip);
SOCKADDR_IN Addr;
Addr.sin_family = AF_INET;
Addr.sin_addr.S_un.S_addr = ulIP;
hostent *pHosten = gethostbyaddr((const char*)&Addr.sin_addr, 4, AF_INET);
ASSERT(pHosten!=NULL);
strRet = pHosten->h_name;
unsigned char macAddress[6];
ULONG macAddLen = 6;
iRet=SendARP(ulIP, ulIP,(PULONG)&macAddress, &macAddLen);
if ( iRet == NO_ERROR )
{
printf( "MacAddress: " );
for( int i =0; i<6; i++ )
{
printf( "%.2x", macAddress[i] );
if ( i<5 ) printf( "-" );
}
printf( "\n" );
}
else printf( "SendARP Error:%d\n", GetLastError());
}
kingzai 2004-11-17
  • 打赏
  • 举报
回复
先确定与NetBIOS有关的三个端口是否打开137 ,138 ,139,如果环境都搭好了,再检查你代码中的问题
lgh21cn 2004-11-17
  • 打赏
  • 举报
回复
非常感谢各位的指导,但本人再重申一遍:目标主机和我的机器同属于一个网段,安装有NetBIOS协议,在使用其它有关NetBIOS协议的函数时正常。
我需要使用的是NetBIOS协议,不使用ARP协议。
请各位大虾继续支招!!!
kingzai 2004-11-16
  • 打赏
  • 举报
回复
直接 SendARP就行了。
得到远程机器MAC地址源代码http://www.chinaoak.com/download/sources/network/RenoteMAC.doc
danyueer 2004-11-16
  • 打赏
  • 举报
回复
需要安装NetBIOS协议,你的情况可能是和目标机器不在同一个网段导致的,建议你把子网掩码设置成高一点的地址。
lgh21cn 2004-11-16
  • 打赏
  • 举报
回复
本机安装有netbios协议,其它netbios函数使用正常。当然是获取局域网内的其它机器的
kingzai 2004-11-16
  • 打赏
  • 举报
回复
1)如果在局域网中,可以使用ARP解析得到目的主机的MAC地址,这个方法只限于局域网内,相同网段的主机有效,不同子网的ARP请求只能得到网关的MAC地址。相关的API:
CreateIpNetEntry
CreateProxyArpEntry
DeleteIpNetEntry
DeleteProxyArpEntry
FlushIpNetTable
GetIpNetTable
SendARP
SetIpNetEntry

2)如果目的主机使用了WINS服务器,你可以把自己的机器设置成使用相同的WINS服务器,然后使用NBTSTAT -A 命令行就可以得到目的主机的MAC地址

2)如果目的主机在公网上,也不是说完全不可能得到它的MAC地址,但是要有一些条件限制:
目的主机与你相连的的网络接口是以太网接口或者PPPOE接口;
目的主机打开了137端口;
你与目的主机之间的网络互连设备没有设置NETBIOS过滤的ACL;
这种条件下,可以通过NetBIOS name query得到目的主机的MAC地址。
DentistryDoctor 2004-11-16
  • 打赏
  • 举报
回复
只能取局域网内的其它机器的。
老夏Max 2004-11-16
  • 打赏
  • 举报
回复
本机需要安装netbios协议!!

18,355

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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