C 和 getifaddrs() 中的链表
Linked List in C and getifaddrs()
本文关键字:链表 getifaddrs 更新时间:2023-10-16
我对链表有问题。我正在使用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;
在此之后,我以这种方式识别系统的所有ifaces,即使它们没有配置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: %sn", iface_aux->interface_name);
printf("Interface IP: %sn", iface_aux->interface_addr_ipv4);
}
奇怪的是接口的名称是正确的,但是当我得到地址时,列表的所有节点都指向同一地址。
有人知道发生了什么事吗?
PS:我是C和链表的新手。
感谢您的关注。
inet_ntoa
使用相同的内存区域来返回结果。您需要自己分配interface_addr_ipv4
并手动复制数据。
char *tmp = inet_ntoa(ip->sin_addr);
iface->interface_addr_ipv4 = malloc(sizeof(char) * (strlen(tmp) + 1)); /* Don't forget to free() */
strcpy(iface->interface_addr_ipv4, tmp);
从文档中:
inet_ntoa() 返回静态缓冲区中的点和数字字符串,每次调用函数都会覆盖该字符串。
更好的方法是使用inet_ntop
:
inet_ntop(AF_INET, ip->sin_addr,
iface->interface_addr_ipv4, sizeof(iface->interface_addr_ipv4));
其中iface->interface_addr_ipv4
是一个字符数组:
char interface_addr_ipv4[INET_ADDRSTRLEN];
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- C 和 getifaddrs() 中的链表