1. 程式人生 > >獲取本機網絡卡IP及對應的mac

獲取本機網絡卡IP及對應的mac

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <arpa/inet.h>
#include <errno.h>
 
 
typedef long LONG;
typedef char CHAR;
#define CONST const
 
#ifndef  SUCCESS
#define  SUCCESS             0
#endif
 
#ifndef  FAIL
#define  FAIL               -1
#endif
 
 
 
LONG GetMac(CONST CHAR *pcIfName, CHAR *pcMac)
{
    if (NULL == pcIfName || NULL == pcMac)
    {
        printf("NULL == pcIfName || NULL == pcMac\n");
        return FAIL;
    }
     
    LONG lFd = 0, lRet = FAIL;
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, pcIfName);
     
    lFd = socket(AF_INET, SOCK_STREAM, 0);
    if(lFd < 0)
    {
        printf("socket fail\n");
        return FAIL;
    }
 
    //lRet = ioctl(lFd, SIOCGIFHWADDR, &ifr, sizeof(ifr));
    lRet = ioctl(lFd, SIOCGIFHWADDR, &ifr);
    if(0 == lRet)
    {
        memcpy(pcMac, ifr.ifr_hwaddr.sa_data, 6);
        printf("\nifr.ifr_hwaddr.sa_data is %s   \n",ifr.ifr_hwaddr.sa_data);
        close(lFd);
        return SUCCESS;
    }  
    else  
    {
        printf("ioctl fail\n");
        close(lFd);
        return FAIL;
    }
}
 
LONG GetIp(CONST CHAR *pcIfName, CHAR *pcIp)
{
    if (NULL == pcIfName || NULL == pcIp)
    {
        printf("NULL == pcIfName || NULL == pcIp\n");
        return FAIL;
    }
     
    LONG lFd = 0, lRet = FAIL;
    struct ifreq ifr;
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, pcIfName);
     
    lFd = socket(AF_INET, SOCK_STREAM, 0);
    if(lFd < 0)
    {
        printf("socket fail\n");
        return FAIL;
    }
 
    lRet = ioctl(lFd, SIOCGIFADDR, &ifr);
    if(0 == lRet)
    {
        strncpy(pcIp,inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr),16);
        close(lFd);
        return SUCCESS;
    }  
    else  
    {
        printf("ioctl fail\n");
        close(lFd);
        return FAIL;
    }
}
 
 
int main()
{
    LONG lRet = FAIL;
    CHAR szMac[6] = {0};
    CHAR szIp[16] = {0};
     
    CHAR szID[21] = {0};
    int i=0;
    int ulLen = 0;
     
    lRet = GetMac("eth0", szMac);
     
    for(i = 0; i < sizeof(szMac); i++)
    {
        sprintf(szID + strlen((const char*)szID), "%02X", szMac[i]);
        ulLen = snprintf(szID, 1024, "%02X", szMac[i]);
        ulLen +=snprintf((szID + ulLen), 1024, "%02X", szMac[i]);
        printf("%0x,",szMac[i]);
    }
    printf("\nlRet is %lu,mac is %s\n",lRet,szID);
     
    lRet = GetIp("eth0", szIp);
     
    printf("lRet is %lu,szIp is %s\n",lRet,szIp);
 
    return 0;
}