我正在尝试通过ioctl
:获取接口名称
int sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in addr = { 0 };
struct ifreq if_req = { 0 };
if (sock_fd == -1) {
perror("socket error");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.136");
if (bind(sock_fd, (struct sockaddr*) &addr, sizeof(addr)) == -1) {
perror("bind error");
return -1;
}
if (ioctl(sock_fd, SIOCGIFNAME, &if_req) == -1) {
perror("ioctl error");
return -1;
}
printf("name: %snip: %sn",
if_req.ifr_ifrn.ifrn_name,
inet_ntoa(addr.sin_addr)
);
但由于某种原因,ioctl
失败,并显示No such device
错误消息。我想知道这里出了什么问题?
查看文档,我们发现以下对SIOCFIFNAME
:的描述
给定
ifr_ifindex
,在ifr_name
。这是唯一返回结果的ioctl在CCD_ 7中。
在您的代码中,您正在初始化ifreq
,如下所示:
struct ifreq if_req = { 0 };
所以所有的值——包括if_req.ifr_ifindex
——都是0。你是询问索引为0的设备的接口名称,但有没有这样的装置。例如,在我的系统中,lo
是索引1,eth0
是索引2:
$ ip -o link
1: lo: ...
2: eth0: ...
每行开头的数字就是接口索引。
您可能想看看如何获取与TCP套接字相关联的接口名称/索引?,它有一些将套接字映射到接口名称的建议。