我的链表有问题。我正在使用 getifaddrs() 在 Linux 中获取 ifaces 信息。
起初,我创建了一个结构来保存接口信息。
这是一个结构:
typedef struct iface {
char * interface_name;
char * interface_addr_ipv4;
char * interface_addr_ipv6;
char * interface_netmask;
char * interface_broadcast;
char * interface_mac_addr;
int interface_active;
struct iface * next_interface;
} Interface;
在此之后,我以这种方式识别系统的所有 iface,即使它们没有配置 IP:
if (getifaddrs(&ifaddr) == -1)
return GET_INFO_IFACES_FAILED;
struct iface * iface_aux;
struct ifaddrs * ifaddr_aux;
struct sockaddr_in * ip;
iface_aux = iface;
for (ifaddr_aux=ifaddr;ifaddr_aux!=NULL;ifaddr_aux=ifaddr_aux->ifa_next) {
iface_aux->interface_name = ifaddr_aux->ifa_name;
if (ip->sin_family == AF_PACKET) {
get_interface_mac_addr(iface_aux);
iface_aux->interface_addr_ipv4 = NULL;
iface_aux->interface_addr_ipv6 = NULL;
iface_aux->next_interface = (Interface *) malloc(sizeof (Interface));
iface_aux = iface_aux->next_interface;
iface_aux->next_interface = NULL;
}
}
毕竟,我做了其他循环来获取接口的IP地址,这是代码:
iface_aux = iface; //go to the firts pointer
for (ifaddr_aux=ifaddr;ifaddr_aux!=NULL;ifaddr_aux=ifaddr_aux->ifa_next) {
ip = (struct sockaddr_in *) ifaddr_aux->ifa_addr;
if (ip->sin_family == AF_INET) {
get_interface_ifaddr(iface_aux, ip);
get_interface_netmask(iface_aux, ifaddr);
get_interface_broadcast(iface_aux, ifaddr);
iface_aux = iface_aux->next_interface;
}
}
函数 get_interface_ifaddr 的代码是:
int get_interface_ifaddr(Interface * iface, struct sockaddr_in * ip) {
iface->interface_addr_ipv4 = inet_ntoa(ip->sin_addr);
if (iface->interface_addr_ipv4 == NULL)
return GET_IFADDR_FAILED;
return GET_IPADDR_SUCCESS;
}
问题是,当我执行另一个循环以查看接口信息时,列表的所有节点都保留最后一个 ip:
for (iface_aux=iface;iface_aux->next_interface!=NULL;iface_aux=iface_aux->next_interface) {
printf("Interface Name: %s\n", iface_aux->interface_name);
printf("Interface IP: %s\n", iface_aux->interface_addr_ipv4);
}
奇怪的是接口的名称是正确的,但是当我得到地址时,列表的所有节点都指向同一个地址。
有人知道发生了什么吗?
PS:我是 c 和链表的新手。
感谢您的关注。