www.pudn.com > arp_get_mac.rar > mac.cpp


#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 ); 
} 
}