我想检索我当前使用的无线接口(interface)的 IP 地址。为此,我使用 ifaddrs.h 中的 getnameinfo()
函数图书馆。我的问题是这个函数返回垃圾值而不是实际的 IP 地址。
这是我使用的函数:
void getWIFromSystem(WI **WIHead) {
struct ifaddrs *ifaddr, *ifa;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(-1);
}
/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET) {
continue;
}
if (check_wireless(ifa->ifa_name)) { / /we want only wireless interfaces
//getWIAdress(ifa->ifa_name, host);
getnameinfo(ifa->ifa_addr, (ifa->ifa_addr->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
addWI(&WIHead, ifa->ifa_name, host);
}
}
freeifaddrs(ifaddr);
}
我设法用我创建的另一个函数解决了这个问题,但我不明白为什么我使用 getnameinfo()
得到垃圾值
我解决问题的其他功能:
void getWIAdress(char *name, char *host) {
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* I want to get an IPv4 IP address */
ifr.ifr_addr.sa_family = AF_INET;
/* I want IP address attached to specified name */
strncpy(ifr.ifr_name, name, IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
/* copy result */
strcpy(host, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}
垃圾值的屏幕截图:
最佳答案
问题是在这种情况下:
if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET)
我们必须将 AF_PACKET
更改为 AF_INET
。这还允许我们绕过由 aircrack-ng
包中的 airmon-ng
生成的虚拟接口(interface)。
通过上述修复,我们也不必在 getnameinfo()
中检查 AF_INET
,因为我们坚持使用 IPv4 地址。
getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
关于c - ifaddrs.h 中的 getnameinfo() 给出了 C 中的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41197650/