c-Linux套接字ioctl SIOCGIFNAME没有这样的设备错误



我正在尝试通过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套接字相关联的接口名称/索引?,它有一些将套接字映射到接口名称的建议。

最新更新