2

特定のネットワーク インターフェイス (VLAN: eth0.32) に割り当てられた IP アドレスを読み取ることができるプログラムを作成しています。IPv4 アドレスが割り当てられているのか、IPv6 アドレスが割り当てられているのかわからないので、プロトコル ファミリに依存しないように記述します。

その仕組みは次のとおりです。for を使用して、使用可能なネットワーク インターフェイスのリストをナビゲートし、VLAN (eth0.32) が見つかったポイントで停止して IP アドレスを読み取ります。とにかく、開発のこの時点では、IPv4 で動作することだけを望んでいますが、IPv6 サポートを実装したい場合は、そのままにしておく必要があります。

ソケットを正常に作成すると、プログラムは動作し、IPv4 アドレスを読み取ります。

sd=socket(PF_INET, SOCK_DGRAM, 0);

しかし、このソケット ファミリ (PF_INET=IPv4) では IPv6 アドレスを読み取ることができないため、次のようにします。

sd=socket(PF_INET6, SOCK_DGRAM, 0);
setsockopt(sd, SOL_SOCKET, IPV6_V6ONLY, 0, sizeof(int));

問題は、この IPv6 ソケットでは、IP アドレスを読み取る if 条件を達成できないことです。

if (ioctl(sd, SIOCGIFCONF, &ifc) == 0)

詳細については、これが私のコード全体です。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netdb.h>
#include <net/if.h>

int main(int argc, char **argv)
{

    struct ifconf ifc;
    struct ifreq ifr[MAX_NETWORK_INTERFACES];
    int ifc_num, addr, i;
    static uint8 sd=0;

    sd=socket(PF_INET6, SOCK_DGRAM, 0);
    setsockopt(sd, SOL_SOCKET, IPV6_V6ONLY, 0, sizeof(int)); //I change the socket option IPV6_V6ONLY to false, so it should be compatible with IPv4

    if (sd > 0)
    {
        ifc.ifc_len = sizeof(ifr);
        ifc.ifc_ifcu.ifcu_buf = (caddr_t)ifr; //Buffer address

        if (ioctl(sd, SIOCGIFCONF, &ifc) == 0)
        {
            ifc_num = ifc.ifc_len / sizeof(struct ifreq);  //Number of network interfaces found

            for (i = 0; i < ifc_num; i++)
            {

                if(ifr[i].ifr_addr.sa_family != AF_INET) //If it is not an IPv4 address, we do nothing
                {
                    continue;
                }

                if (strcmp(ifr[i].ifr_ifrn.ifrn_name,"eth0.32")==0)
                {
                    if (ioctl(sd, SIOCGIFADDR, &ifr[i]) == 0) // HERE IS WHERE THE IPv6 SOCKET DOESN'T ENTER!!!
                    {
                        addr = ntohl(((struct sockaddr_in *)(&ifr[i].ifr_addr))->sin_addr.s_addr);

                    }

                    fclose(fp);

                    break;  // end loop
                }
            }
        }
    }
    return addr;

}

よろしくお願いします。

4

1 に答える 1