读局域网内的服务器的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地址";
}
}
...全文
163 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
onhu 2005-04-14
  • 打赏
  • 举报
回复
问题一解决,是用IP读MAC的代码不够好……散分
CWYCN 2005-04-13
  • 打赏
  • 举报
回复
学习
icwin 2005-04-13
  • 打赏
  • 举报
回复
学习啊
onhu 2005-04-07
  • 打赏
  • 举报
回复
我发现是读IP出错了,但网上邻居是能访问服务器的……这到底是怎么回事呢?
constantine 2005-04-07
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////////////////
#include "winsock.h"
#include <nb30.h>
#include <iostream.h>

LPCSTR __fastcall 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]);
lpmac=mac;
WSACleanup();
return lpmac;
}
else
{
WSACleanup();
return "无法解释MAC地址";
}
}

//测试
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ShowMessage(GetMacAddress("192.168.0.200"));
}
//---------------------------------------------------------------------------
Friecin 2005-04-07
  • 打赏
  • 举报
回复

得到远程机器MAC地址源代码
作者: ---------- ,如转载请保证本文档的完整性,并注明出处。
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=104
#include
#include
#include
#include "iphlpapi.h"

#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "Iphlpapi.lib" )

void main( int argc, char ** argv )
{
int numberOfHost = 1;
struct hostent *remoteHostent;

//处理命令行参数
if ( argc == 3 )
numberOfHost = atoi( argv[2] );
if ( ( argc >3 ) || ( argc < 2 ) )
{
printf( "RmtHost v0.2 - Get remote HostName /MacAddress\n" );
printf( "by ShotgunLabs ( Shotgun@xici.net )\n\n" );
printf( "Usage :\n\tRmtHost.exe [RemoteIP] \n\n" );
printf( "Example:\n\tRmtHost.exe 192.168.0.3\n" );
printf( "\tRmtHost.exe 192.168.0.3 255\n\n" );
exit( 0 );
}

//初始化SOCKET
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2,1), &wsaData);
if ( iRet != 0 )
{
printf( "WSAStartup Error:%d\n", GetLastError() );
exit( 0 );
}
int nRemoteAddr = inet_addr( argv[1] );
remoteHostent= (struct hostent*)malloc( sizeof(struct hostent ));
struct in_addr sa;
for ( int i = 0; i < numberOfHost; i ++ )
{
//获取远程机器名
sa.s_addr = nRemoteAddr;
printf( "\nIpAddress : %s\n", inet_ntoa( sa ) );
remoteHostent = gethostbyaddr( (char*)&nRemoteAddr,4, AF_INET );
if ( remoteHostent )
printf( "HostName : %s\n",remoteHostent->h_name );
else
printf( "gethostbyaddr Error:%d\n",GetLastError() );
//发送ARP查询包获得远程MAC地址

unsigned char macAddress[6];
ULONG macAddLen = 6;
iRet=SendARP(nRemoteAddr, (unsigned long)NULL,(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());
nRemoteAddr = htonl( ntohl( nRemoteAddr ) + 1 );
}
}
onhu 2005-04-07
  • 打赏
  • 举报
回复
结果个别客户端读出的MAC措掉了……网络是正常的
onhu 2005-04-07
  • 打赏
  • 举报
回复
有没有别的通过机器名读IP的方法呢(要跟我贴的那个不一样的),或者帮我看看我那段读IP的代码有什么问题?谢拉

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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