Linux下如何得到本机所有IP地址及MAC地址

21 篇文章 0 订阅
已知: 
gethost and gethostbyname,测试只能得到一个IP地址。 
--------------------------------------------------------------- 


原文:http://www.chinaunix.net/jh/23/161236.html 
--------------------------------------------------------------- 
整理后的代码(在fc6下经过本人编译测试通过): 

/*
cc getmac.c -o getmac
*/
#include <stdio.h>      
#include <sys/types.h>      
#include <sys/param.h>      

#include <sys/ioctl.h>      
#include <sys/socket.h>      
#include <net/if.h>      
#include <netinet/in.h>      
#include <net/if_arp.h>      
#include <arpa/inet.h> 
#include <unistd.h> //for close() 

#define MAXINTERFACES      16      

int main(int argc, char** argv) 

    int fd, intrface, retn = 0;      
    struct ifreq buf[MAXINTERFACES];      
    struct arpreq arp;      
    struct ifconf ifc;      

/*
    if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) 
*/

    if((fd = socket(AF_INET,SOCK_DGRAM,0)) >= 0) 
    { 
        ifc.ifc_len = sizeof(buf);      
        ifc.ifc_buf = (caddr_t) buf;      
        if (!ioctl(fd, SIOCGIFCONF, (char *) &ifc)) 
        { 
            intrface = ifc.ifc_len / sizeof(struct ifreq);    
            printf("interface num is intrface=%d\n\n\n", intrface);      
            while (intrface-- > 0) 
            { 
                printf("====================interface:%d====================\n",intrface);
                printf("net device %s\n", buf[intrface].ifr_name);   
   


                /*Jugde whether the net card status is promisc    */      
                if (!(ioctl(fd, SIOCGIFFLAGS, (char *) &buf[intrface]))) 
                { 
                    if (buf[intrface].ifr_flags & IFF_PROMISC) 
                    { 
                        puts("the interface is PROMISC");      
                        retn++; 
                    } 
                } 
                else 
                { 
                    char str[256];      
                    sprintf(str, "cpm: ioctl device %s", 
                            buf[intrface].ifr_name);      
                    perror(str); 
                }      

                /*Jugde whether the net card status is up                  */      
                if (buf[intrface].ifr_flags & IFF_UP) 
                { 
                    puts("the interface status is UP"); 
                } 
                else 
                { 
                    puts("the interface status is DOWN"); 
                }      
                /*Get IP of the net card */      
                if (!(ioctl(fd, SIOCGIFADDR, (char *) &buf[intrface]))) 
                { 
                    puts("IP address is:");      
                    puts(inet_ntoa(((struct sockaddr_in *) 
                            (&buf[intrface].ifr_addr))->sin_addr));      
                    puts("");      
                    //puts (buf[intrface].ifr_addr.sa_data);      
                } 
                else 
                { 
                    char str[256];      
                    sprintf(str, "cpm: ioctl device %s", 
                            buf[intrface].ifr_name);      
                    perror(str); 
                }    



                /*Get HW ADDRESS of the net card */      
                if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[intrface]))) 
                { 
                    puts("HW address is:");      
                    printf("%02x:%02x:%02x:%02x:%02x:%02x\n", 
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[0],    
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[1], 
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[2],    
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[3],    
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[4],    
                            (unsigned char) buf[intrface].ifr_hwaddr.sa_data[5]); 
                    puts("");      
                    puts(""); 
                } 
                else 
                { 
                    char str[256];      
                    sprintf(str, "cpm: ioctl device %s", buf[intrface].ifr_name);      
                    perror(str); 
                } 
            } 
        } 
        else 
            perror("cpm: ioctl"); 
    } 
    else 
        perror("cpm: socket");      

    close(fd);      
    return retn; 
}

另外一个整理好的:
/*
cc getmac.c -o getmac1
*/
#include <stdio.h>;
#include <string.h>;
#include <netdb.h>;
#include <arpa/inet.h>;
#include <netinet/in.h>;
#include <sys/types.h>;
#include <sys/socket.h>;
#include <sys/ioctl.h>;
#include <net/if.h>;
#include <net/if_arp.h>;
#include <net/ethernet.h>;
#include <signal.h>;
#include <netinet/ip.h>;

struct in_addr myself,mymask;
int fd_arp;
struct ifreq ifr;

main(int argc,char* argv[]) {
char device[32];
struct sockaddr from,to;
int fromlen;
struct sockaddr_in *sin_ptr;
u_char *ptr;
int n;
strcpy(device,"lo");
if((fd_arp=socket(AF_INET,SOCK_PACKET,htons(0x0806)))<0) {
    perror("arp socket error");
    exit(-1);
}

strcpy(ifr.ifr_name,device);
if(ioctl(fd_arp,SIOCGIFADDR,&ifr)<0) {
    perror("ioctl SIOCGIFADDR error");
    exit(-1);
}
sin_ptr=(struct sockaddr_in *)&ifr.ifr_addr;
myself=sin_ptr->sin_addr;

// get network mask
if(ioctl(fd_arp,SIOCGIFNETMASK,&ifr)<0) {
    perror("ioctl SIOCGIFNETMASK error");
    exit(-1);
}
sin_ptr=(struct sockaddr_in *)&ifr.ifr_addr;
mymask=sin_ptr->sin_addr;

//if (!(ioctl(fd, SIOCGIFHWADDR, (char *) &buf[intrface])))
// get mac address
if(ioctl(fd_arp,SIOCGIFHWADDR,&ifr)<0) {
    perror("ioctl SIOCGIFHWADDR error");
    exit(-1);
}
ptr=(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
printf("\nrequest mac %02x:%02x:%02x:%02x:%02x:%02x,",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
printf("\nrequest netmask %s",inet_ntoa(mymask));
printf("\nrequest IP %s\n",inet_ntoa(myself));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值