0

私はちょうどこのスニペットを書きました:

#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>

int main(void)
{
    sockaddr_in self;
    hostent *he;
    char local[HOST_NAME_MAX];
    gethostname(local, sizeof(local));
    he = gethostbyname(local);

    if (he)
    {
        std::cout << "Addresses: " << std::endl;
        unsigned int i = 0;
        while(he->h_addr_list[i] != NULL)
        {
            std::cout << "\t" << i << " --> ";
            memcpy(&self.sin_addr, he->h_addr_list[i], he->h_length);
            std::cout << self.sin_addr.s_addr;
            std::cout << " ( " << inet_ntoa( *( struct in_addr*)( he-> h_addr_list[i])) << " )" << std::endl;
            i++;
        }
    }
    else
        std::cout << "gethostname failed" << std::endl;
}

サンプルホストで実行すると、次のような結果が得られます(ただし、これらのアドレスはここで作成しました):

アドレス: 0 --> 1307150150 (10.23.215.61)

一方、実行するifconfigと、はるかに多くの出力が得られます。特に、上記のアドレスは、最初に表示されたインターフェイスのifconfig前に少なくとも 2 つある場合にのみ対応しeth0ます。どうして?これが、このホストで可能なすべてのネットワークアドレスを通過すると予想していました...

以下の回答の後、次のことを行いました(getaddrinfoを使用):

int main(void)
{
    struct addrinfo *result;
    struct addrinfo *res;
    int error;

    char local[HOST_NAME_MAX];
    gethostname(local, sizeof(local));

    error = getaddrinfo(local, NULL, NULL, &result);
    if (error != 0)
    {
        fprintf(stderr, "error in getaddrinfo: %s\n", gai_strerror(error));
        return 1;
    }

    for (res = result; res != NULL; res = res->ai_next)
    {
        struct in_addr addr;
        addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
        std::cout << addr.s_addr
                  << " ("
                  << inet_ntoa(addr)
                  << " )"
                  << std::endl;
    }

    freeaddrinfo(result);
}

「正しい」回数を繰り返したことを除いて、以前と同じ出力が得られます。(つまり、ifconfig から、おそらくマルチキャストで送信できる 3 つのインターフェイスが表示され、上記の出力として 3 回繰り返される最初のインターフェイスの inet アドレスが取得されます。

4

1 に答える 1

1

この関数gethostnameは、ホストが構成されている名前を返します。任意の名前でコンピュータを自由に構成できます。

この関数gethostbynameは、OS の「通常の」名前解決プロセスを実行します。/etc/hosts通常、最初に DNS リゾルバーを照会し、失敗したことを調べます。

設定したすべての IP アドレスを取得するには、それらをファイルgethostbynameに入れるか、DNS 管理者にサーバーの更新を依頼する必要があります。/etc/hosts

ところで、getaddrinfogethostbynameを支持して廃止予定です。

于 2012-12-24T07:01:50.700 に答える