读局域网内的服务器的MAC地址失败
onhu 2005-04-07 11:00:14 大多数客户端机器上都可以,只有个别不行,也不知哪个环节出错了,
我是通过服务器名称取得IP,然后通过IP去读MAC地址的
// 获取指定主机的IP地址
String Host2Ip(String strDomain)
{
SOCKADDR_IN saddr;
WORD wVersionRequested;
WSADATA wsaData;
hostent *pHostIp;
int nErrorNum;
wVersionRequested = MAKEWORD(2, 2);
nErrorNum = WSAStartup(wVersionRequested, &wsaData);
if(nErrorNum != 0)
{
// MessageBox(Application->Handle,
// SysErrorMessage(GetLastError()).c_str(), "初始化错!", MB_OK|MB_ICONERROR);
return "";
}
saddr.sin_family = AF_INET;
pHostIp = gethostbyname(strDomain.c_str());
if(pHostIp == NULL)
{
// MessageBox(Application->Handle,
// SysErrorMessage(GetLastError()).c_str(), "转换出错!", MB_OK|MB_ICONERROR);
return "0.0.0.0";
}
WSACleanup();
return (String)inet_ntoa(*(LPIN_ADDR)*(pHostIp->h_addr_list));
}
/////////////////////////////////////////////////
//读MAC地址
LPCSTR GetMacAddress(AnsiString str)
{
WSAData GInitData;
if (WSAStartup(MAKEWORD(2,1),&GInitData) != 0)
{
return "初始化SOCKET函数失败!";
}
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuf[30];
}ASTAT,* PASTAT;
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;
strcpy((char *)ncb.ncb_callname,str.c_str());
ncb.ncb_buffer=(unsigned char *)&Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&ncb);
if(uRetCode==0)
{
char mac[15], * lpmac;
sprintf(mac,"%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]);
/*sprintf(mac,"%02X%02X%02X%02X",
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3]);*/
lpmac=mac;
WSACleanup();
return lpmac;
}
else
{
WSACleanup();
return "无法解释MAC地址";
}
}