我想检索我使用的当前无线接口的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));
}
垃圾值的屏幕截图:
答案 0 :(得分:0)
问题出在这种情况:
if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET)
我们必须使用AF_PACKET
更改AF_INET
。这也将允许我们绕过airmon-ng
包aircrack-ng
生成的虚拟接口。
通过上述修复,由于我们坚持使用IPv4地址,因此我们也不必在AF_INET
中检查getnameinfo()
。
getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);