2

問題があり、この問題を解決できません。

コンピュータに 3 つのイーサネット ボードがあり、3 つのポートのうち 2 つにケーブルが接続されています。リストに従ってください:

Eth0 - ケーブルが差し込まれています。
Eth1 - ケーブルなし。
Eth2 - ケーブルが差し込まれています。

プログラムを実行してインターフェイスの IP アドレスを取得すると、プログラムは eth2 の IP を eth1 に設定しました。

eth0 - 192.168.2.103
eth1 - (null)
eth2 - 192.168.2.101

次のように終了します。

eth0 - 192.168.2.103
eth1 - 192.168.2.101
eth2 - (ヌル)

何が起こっているのか理解できません。
コードに従ってください:

私は構造を持っています。

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;

この後、IP で構成されていなくても、この方法でシステムのすべての iface を識別します。

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 を使用してコードをデバッグすると、何が問題なのかわかりません。

4

0 に答える 0