linux /unix 下c语言代码获取机器mac地址,自动获取不要输入?

shiter
人工智能领域优质创作者
博客专家认证
2013-05-27 03:24:34
linux /unix 下c语言代码获取机器mac地址,自动获取不要输入?
求代码
...全文
343 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2013-06-03
  • 打赏
  • 举报
回复
引用 3 楼 Idle_Cloud 的回复:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>

static void usage(char *proc){
        printf("usage : %s interface \n", proc);
        exit(0);
}

int main(int argc,char **argv)
{
        struct sockaddr_in *addr;
        struct ifreq ifr;
        char *name,*address;
        int sockfd;
        int i;
        if(argc != 2)
        {
                usage(argv[0]);
        }
        else
        {
                name = argv[1];
        }

        sockfd = socket(AF_INET,SOCK_DGRAM,0);

        strncpy(ifr.ifr_name,name,IFNAMSIZ-1);

        if(ioctl(sockfd,SIOCGIFADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&(ifr.ifr_addr);
        address = inet_ntoa(addr->sin_addr);
        printf("inet addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFBRDADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
        address = inet_ntoa(addr->sin_addr);
        printf("broad addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_addr;
        address = inet_ntoa(addr->sin_addr);
        printf("inet mask: %s ",address);
        printf("\n");

        if(ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
                perror("ioctl error"), exit(1);
        unsigned char * mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
        for(i=0;i<6;i++)
                printf("%02x:",mac[i]);
        printf("\n");

        exit(0);
}
自动获取不要输入?
Carl_CCC 2013-05-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <net/if.h>

static void usage(char *proc){
        printf("usage : %s interface \n", proc);
        exit(0);
}

int main(int argc,char **argv)
{
        struct sockaddr_in *addr;
        struct ifreq ifr;
        char *name,*address;
        int sockfd;
        int i;
        if(argc != 2)
        {
                usage(argv[0]);
        }
        else
        {
                name = argv[1];
        }

        sockfd = socket(AF_INET,SOCK_DGRAM,0);

        strncpy(ifr.ifr_name,name,IFNAMSIZ-1);

        if(ioctl(sockfd,SIOCGIFADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&(ifr.ifr_addr);
        address = inet_ntoa(addr->sin_addr);
        printf("inet addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFBRDADDR,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
        address = inet_ntoa(addr->sin_addr);
        printf("broad addr: %s ",address);

        if(ioctl(sockfd,SIOCGIFNETMASK,&ifr) == -1)
                perror("ioctl error"),exit(1);
        addr = (struct sockaddr_in *)&ifr.ifr_addr;
        address = inet_ntoa(addr->sin_addr);
        printf("inet mask: %s ",address);
        printf("\n");

        if(ioctl(sockfd, SIOCGIFHWADDR, &ifr) == -1)
                perror("ioctl error"), exit(1);
        unsigned char * mac = (unsigned char *)ifr.ifr_hwaddr.sa_data;
        for(i=0;i<6;i++)
                printf("%02x:",mac[i]);
        printf("\n");

        exit(0);
}
shiter 2013-05-27
  • 打赏
  • 举报
回复
引用 1 楼 Idle_Cloud 的回复:
socket + ioctl, busybox里面有代码。
我看了一下,我是在darwin内核搞的,

 if( (ioctl( sock_mac, SIOCGIFHWADDR, &tmp)) < 0 ){
        printf("mac ioctl error\n");
        return -1;
    }

xcode提示我缺少这个?SIOCGIFHWADDR,我头文件都包含对着呢呀。
Carl_CCC 2013-05-27
  • 打赏
  • 举报
回复
socket + ioctl, busybox里面有代码。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧