C IP地址与错误的接口关联

C IP地址与错误的接口关联,c,linux,ip,C,Linux,Ip,我有个问题,我解决不了这个问题 我的计算机中有3块以太网板,在3个端口中的2个端口中插入了一根电缆。请按以下列表操作: Eth0-电缆已插入。 Eth1-无电缆。 Eth2-电缆已插入 当我运行程序获取接口的ip地址时,我的程序将eth2的ip设置为eth1,应该是这样的: eth0-192.168.2.103 eth1-(空) eth2-192.168.2.101 结局是这样的: eth0-192.168.2.103 eth1-192.168.2.101 eth2-(空) 我不明白发生了什么事

我有个问题,我解决不了这个问题

我的计算机中有3块以太网板,在3个端口中的2个端口中插入了一根电缆。请按以下列表操作:

Eth0-电缆已插入。
Eth1-无电缆。
Eth2-电缆已插入

当我运行程序获取接口的ip地址时,我的程序将eth2的ip设置为eth1,应该是这样的:

eth0-192.168.2.103
eth1-(空)
eth2-192.168.2.101

结局是这样的:

eth0-192.168.2.103
eth1-192.168.2.101
eth2-(空)

我不明白发生了什么事。
请遵循以下代码:

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;
    }
}
我有和结构

typedef struct iface {
    char interface_name[10];
    char interface_addr_ipv4[20];
    char interface_addr_ipv6[40];
    char interface_netmask[20];
    char interface_broadcast[20];
    char interface_mac_addr[50];
    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);
        strcpy(iface_aux->interface_addr_ipv4,"");
        strcpy(iface_aux->interface_addr_ipv6,"");
        iface_aux->next_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) {
    char temp[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &ip->sin_addr, temp, INET_ADDRSTRLEN);
    strcpy(iface->interface_addr_ipv4, temp);
    return GET_IPADDR_SUCCESS;
}

我不明白为什么eth2的ip设置在eth1中,也不明白发生了什么。当我用netbeans和GDB调试代码时,我看不出有什么问题。

为什么不在第一个循环中填写IP地址,而不是两个不同的循环?因为我得到了所有接口,即使是尚未配置的接口,在我得到配置接口的IP之后。这就是问题所在。由于第二个循环没有获得所有接口,因此它的循环与
iface
链接列表不同步。需要检查接口名称是否匹配;如果没有,请转到下一个界面。你是对的,对不起@巴尔马,你应该写下来作为回答。