// 获取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;
}

解决方案 »

  1.   

    囧,太长了。短的话帮你改改。
    就功能用C#编写获取远程IP,MAC的方法
    http://publish.it168.com/2005/0804/20050804124701.shtml
      

  2.   

    C#里有简便的方法using System.Net;
    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"));
    }
    }
      

  3.   


    // 简化一下,主要就是这段,希望大侠帮帮忙,多谢!
    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;
    }
      

  4.   

    LZ搜搜C类型转换成C#类型的基本做法,就能改过来了没看出来难在哪里!