linux网络编程-获得硬件地址

在Linux socket编程中,通常使用ioctl的SIOCGIFHWADDR命令获取硬件地址。本文通过示例代码展示了如何获取以太网卡eth0的MAC地址,并解释了为何不能直接以字符串形式打印硬件地址,而应以16进制形式输出。
摘要由CSDN通过智能技术生成

    在socket编程中,我们一般使用ioctl中的SIOCGIFHWADDR来获得硬件地址,其核心源代码如下:

#include <stdio.h>

#include <linux/if.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/ioctl.h>


int main()

{

struct ifreq *ifr;

int sock, retval;

char* name;

sock = socket(AF_INET, SOCK_DGRAM, 0);

strcpy(ifr->ifr_name, "eth0");

retval = ioctl(sock,SIOCGIFHWADDR, ifr);

    if (retval < 0)

    {

        perror("ioctl error\n");

        exit(0);   

    }

    name = ifr->ifr_hwaddr.sa_data;

    printf("%02x:%02x:%02x:%02x:%02x:%02x",name[0], name[1], name[2], name[3], name[4], name[5]);

    return 0;

}

        一开始想直接用printf("%s\n", name);将硬件地址直接输出,但发现是乱码,本来以为这样可能得不到硬件地址,想了很久才明白。其实我已经取得硬件地址了,但是由于固有的编程思想的影响,一遇到char型就想用%s输出,实际上数据在内存中存储时本来就没有固定的意义,完全可以根据需要给予数据特定的意义,所以此处虽然数据是用char型存储的,但是这里只用把它当成是一个单字节的数据就可以了。所以此处将其作为16进制用%x输出。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值