Linux通过socket获取网口相关信息

该博客介绍了如何在Linux环境中利用socket接口,特别是在使用sendmsg等函数发送报文时,如何正确填充网口索引和本端IP地址,以实现以太网头部的正确构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、通过网口名称获取网口索引

主要用于调用sendmsg等接口发送报文时填充网口索引

#include <stdio.h>
#include <stdlib.h>
#include <net/if.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <string.h>

int get_dev_index_by_dev_name(int sock_fd, char *dev)
{
    int ret = -1;
    struct ifreq ifr;

    if (NULL == dev)
    {
        return -1;
    }

    memset(&ifr, 0, sizeof(struct ifreq));
    snprintf(ifr.ifr_name, IFNAMSIZ, "%s", dev);

    ret = ioctl(sock_fd, SIOCGIFINDEX, &ifr);
    if (ret < 0)
    {
        printf("ioctl SIOCGIFINDEX failed, sock_fd:%d, dev:%s\n", sock_fd, dev);
        return -errno;
    }

    return ifr.ifr_ifindex;
}

二、通过网口索引获取MAC地址

主要用于发送报文时以太头填充本端IP地址

#include <stdio.h>
#include <stdlib.h>
#include <net/if.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <string.h>

int get_mac_by_dev_index(int sock_fd, int dev_index, char* mac)
{
    struct ifreq ifr;

    if(NULL == mac)
    {
        return -1;
    }

    if( (sock_fd < 0)||(dev_index < 0) )
    {
        return -1;    
    }

    if( ioctl(sock_fd, SIOCGIFHWADDR, &ifr) < 0 )
    {
        printf("ioctl SIOCGIFHWADDR failed, sock_fd:%d, dev_index:%d\n", sock_fd, dev_index);
        return -errno;
    }

    memcpy(mac, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN);
    return 0;
}   

三、通过IP地址和网口名称获取ARP表项中的远端MAC地址
主要用于发送报文时以太头填充远端MAC地址

#include <stdio.h>
#include <stdlib.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>

int get_dst_mac_by_ipdev(int sock_fd, unsigned int ip, char* dev, char* mac)
{
    struct arpreq arpr;
    struct sockaddr_in *psockaddr;

    if(sock_fd < 0)
    {
        return -1;
    }

    if( (NULL == dev)||(NULL == mac) )
    {
        return -1;
    }

    memset(&arpr, 0, sizeof(arpr));
    psockaddr = (struct sockaddr_in*)&arpr.arp_pa;
    psockaddr->sin_family = AF_INET;
   psockaddr->sin_addr.s_addr = htonl(ip);

    memcpy(arpr.arp_dev, dev, IFNAMSIZ);

    if(ioctl(sock_fd, SIOCGARP, &arpr) < 0)
    {
        printf("ioctl SIOCGARP failed, sock_fd:%d, ip:%s, dev:%s\n", sock_fd, inet_ntoa(ip), dev);
        return -errno;
    }

    memcpy(mac, arpr.arp_ha.sa_data, IFHWADDRLEN);
    return 0;
}
   




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值