// 获取MAC地址函数
bool getMACaddr(const char *IP, char *strMAC)
{
HRESULT hr;
IPAddr ipAddr;
ULONG pulMac[ 2 ];
ULONG ulLen;
char *tmp0 = new char[50];
char *tmp1 = new char[50];
memset(tmp0,0,50);
memset(tmp1,0,50); char temp[]="ffffffffffff";
strcpy(strMAC,temp);
ipAddr = inet_addr(IP);
memset( pulMac,0xff,sizeof( pulMac ) );
ulLen = 6;
hr = SendARP( ipAddr,0,pulMac,&ulLen );
if( NO_ERROR != hr || ulLen == 0 ) // Cannot get MAC address.
{
return false;
}
ULONG i;
char * szMac = new char[ ulLen * 3 ];
PBYTE pbHexMac = ( PBYTE )pulMac; for( i = 0; i < ulLen - 1; ++ i )
{
sprintf(tmp0, "%02x",pbHexMac[i]);
strcat(tmp1,tmp0);
}
sprintf(tmp0,"%02x",pbHexMac[i]);
strcat(tmp1,tmp0);
strcpy(strMAC,tmp1); delete [] szMac;
delete [] tmp0;
delete [] tmp1;
return true;
}
// 获取IP/MAC
#define MAX_BUF 4096
#define LOCATION "Location:"unsigned int quiet = 0;
char ip[16];int EnumDeviceList(int dimLen, int dimCount, int *ncount, char *addr, char *perr)
{
int iRet = 0;
char *err = new char[100];
memset(err,0,100);
perr = err; int sock, ret, one = 1, len;
struct sockaddr_in cliaddr, destaddr;
hostent *hostinfo;
struct timeval tv;
char buffer[MAX_BUF] = "test data";
char *token;
int count = 0; char *arr[600];
*ncount = 0;
char *cliMac = new char[30];
memset(cliMac,0,30); WORD sockVersion;
WSADATA wsaData;
int rVal;
sockVersion = MAKEWORD(1,1);
//start dll
WSAStartup(sockVersion, &wsaData);
/* Create socket */
sock = socket(AF_INET,SOCK_DGRAM , 0);
if (INVALID_SOCKET == sock)
{
sprintf(perr,"Cannot open socket [%d]\n", WSAGetLastError());
WSACleanup();
perr = err;
return iRet;
} /* Allow broadcast on the socket */
ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char FAR *)&one, sizeof(one));
if (ret < 0)
{
sprintf(perr,"Cannot prepare socket for broadcast\n");
WSACleanup();
perr = err;
return iRet;
} /* Set receive timeout */
tv.tv_sec = 30;
ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
if (ret < 0)
{
sprintf(perr,"Cannot set time-out to the socket\n");
WSACleanup();
perr = err;
return iRet;
} /* bind ipaddr:port */
cliaddr.sin_family = AF_INET;
if (strlen(ip) > 0)
cliaddr.sin_addr.s_addr = inet_addr(ip);
else
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliaddr.sin_port = htons(0);
// printf("Client Address:%s; Port: %d\r\n",inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port); ret = bind(sock, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
if (ret < 0)
{
sprintf(perr,"Cannot bind port\n");
WSACleanup();
perr = err;
return iRet;
} /* Set destination for broadcast address */
destaddr.sin_family = AF_INET;
destaddr.sin_addr.s_addr = INADDR_BROADCAST;
destaddr.sin_port = htons(3700); /* Send the broadcast packet */
len = strlen(buffer);
ret = sendto(sock, buffer, len, 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
if (ret < 0)
{
sprintf(perr,"Cannot send data\n");
WSACleanup();
perr = err;
return iRet;
} /* quiet the noise */
if (quiet == 0)
printf("Sent broadcast request and now waiting for a response..\n"); while (1)
{
/* Wait for response */
len = sizeof(destaddr);
ret = recvfrom(sock, buffer, MAX_BUF, 0, (struct sockaddr *)&destaddr, &len);
if (ret == -1) /* time out */
break;
count++; /* Valid response */ /* Parse the response */
token = strtok(buffer, "\r\n");
while (token != NULL)
{
if (!strncmp(token, LOCATION, strlen(LOCATION)))
{
sprintf(perr,"Found a device: %s\n", token + strlen(LOCATION));
break;
}
token = strtok(NULL, "\r\n");
} getMACaddr(inet_ntoa(destaddr.sin_addr),cliMac);
sprintf( addr+(iCount-1)*dimCount,"%s-%s",inet_ntoa(destaddr.sin_addr),cliMac);
}
int iCount = count; if (count>0)
{
iRet = 1;
*ncount = count;
}
else
{
iRet = 0;
*ncount = 0;
}
return iRet;
}
就功能用C#编写获取远程IP,MAC的方法
http://publish.it168.com/2005/0804/20050804124701.shtml
using System;
using System.Management;
using System.Runtime.InteropServices;public class getIP
{
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip); //获取本机的IP
public string getLocalIP()
{
string strHostName = Dns.GetHostName(); //得到本机的主机名
IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP
string strAddr = ipEntry.AddressList[0].ToString();
return(strAddr);
}
//获取本机的MAC
public string getLocalMac()
{
string mac = null;
ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject mo in queryCollection )
{
if(mo["IPEnabled"].ToString() == "True")
mac = mo["MacAddress"].ToString();
}
return(mac);
}//获取远程主机IP
public string[] getRemoteIP(string RemoteHostName)
{
IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName);
IPAddress[] IpAddr = ipEntry.AddressList;
string[] strAddr = new string[IpAddr.Length];
for (int i=0;i<IPADDR.LENGTH;I++)
{
strAddr[i] = IpAddr[i].ToString();
}
return(strAddr);
}
//获取远程主机MAC
public string getRemoteMac(string localIP, string remoteIP)
{
Int32 ldest= inet_addr(remoteIP); //目的ip
Int32 lhost= inet_addr(localIP); //本地ip try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return Convert.ToString(macinfo,16);
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0.ToString();
}
public static void Main(string[] args)
{
getIP gi = new getIP();
Console.WriteLine("本地网卡信息:");
Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac());
Console.WriteLine("\n\r远程网卡信息:");
string[] temp = gi.getRemoteIP("scmobile-tj2");
for(int i=0;i<TEMP.LENGTH;I++)
{
Console.WriteLine(temp[i]);
}
Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1"));
}
}
// 简化一下,主要就是这段,希望大侠帮帮忙,多谢!
int EnumDeviceList(int dimLen, int dimCount, int *ncount, char *addr, char *perr)
{
int iRet = 0;
char *err = new char[100];
memset(err,0,100);
perr = err; int sock, ret, one = 1, len;
struct sockaddr_in cliaddr, destaddr;
hostent *hostinfo;
struct timeval tv;
char buffer[MAX_BUF] = "test data";
char *token;
int count = 0;
*ncount = 0;
char *cliMac = new char[30];
memset(cliMac,0,30); WORD sockVersion;
WSADATA wsaData;
int rVal;
sockVersion = MAKEWORD(1,1);
//start dll
WSAStartup(sockVersion, &wsaData);
sock = socket(AF_INET,SOCK_DGRAM , 0);
if (INVALID_SOCKET == sock)
{
WSACleanup();
return iRet;
} /* Allow broadcast on the socket */
ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char FAR *)&one, sizeof(one));
if (ret < 0)
{
WSACleanup();
return iRet;
} /* Set receive timeout */
tv.tv_sec = 30;
ret = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
if (ret < 0)
{
WSACleanup();
return iRet;
} /* bind ipaddr:port */
cliaddr.sin_family = AF_INET;
if (strlen(ip) > 0)
cliaddr.sin_addr.s_addr = inet_addr(ip);
else
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliaddr.sin_port = htons(0); ret = bind(sock, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
if (ret < 0)
{
WSACleanup();
return iRet;
} /* Set destination for broadcast address */
destaddr.sin_family = AF_INET;
destaddr.sin_addr.s_addr = INADDR_BROADCAST;
destaddr.sin_port = htons(3700); /* Send the broadcast packet */
len = strlen(buffer);
ret = sendto(sock, buffer, len, 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
if (ret < 0)
{
WSACleanup();
return iRet;
} /* quiet the noise */
if (quiet == 0)
printf("Sent broadcast request and now waiting for a response..\n"); while (1)
{
/* Wait for response */
len = sizeof(destaddr);
ret = recvfrom(sock, buffer, MAX_BUF, 0, (struct sockaddr *)&destaddr, &len);
if (ret == -1) /* time out */
break;
count++; /* Valid response */ /* Parse the response */
token = strtok(buffer, "\r\n");
while (token != NULL)
{
if (!strncmp(token, LOCATION, strlen(LOCATION)))
{
sprintf(perr,"Found a device: %s\n", token + strlen(LOCATION));
break;
}
token = strtok(NULL, "\r\n");
} getMACaddr(inet_ntoa(destaddr.sin_addr),cliMac);
sprintf( addr+(iCount-1)*dimCount,"%s-%s",inet_ntoa(destaddr.sin_addr),cliMac);
}
int iCount = count; if (count>0)
{
iRet = 1;
*ncount = count;
}
else
{
iRet = 0;
*ncount = 0;
}
return iRet;
}