一、通过网口名称获取网口索引
主要用于调用sendmsg等接口发送报文时填充网口索引
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#include
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;
}