linux获取socket响应,Linux通过socket获取网口相关信息

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

主要用于调用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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值