18

getaddrinfo() 関数を使用してローカル (外部ではなく) IP アドレスを取得しようとしていますが、ここで提供されている例を見ましたが、ニーズに対して複雑すぎます。他の投稿も見ましたが、それらのほとんどは、ローカル IP ではなく、外部 IP を取得したいと考えていました。

この関数を使用して自分のローカル IP アドレスを取得する方法について、簡単な例 (または簡単な例) へのリンクを提供できる人はいますか?

ローカルと言うときに明確にするために、ルーターが の192.168.0.1場合、ローカル IP アドレスは次のようになります192.168.0.x(単なる例)。

4

2 に答える 2

37

getaddrinfo()ローカルIPアドレスを取得するためのものではありません.ソケットアドレスへの名前やサービスを検索するためのものです. ローカル IP アドレスを取得するために必要な機能は次getifaddrs()のとおりです。最小限の例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <ifaddrs.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    struct ifaddrs *myaddrs, *ifa;
    void *in_addr;
    char buf[64];

    if(getifaddrs(&myaddrs) != 0)
    {
        perror("getifaddrs");
        exit(1);
    }

    for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
    {
        if (ifa->ifa_addr == NULL)
            continue;
        if (!(ifa->ifa_flags & IFF_UP))
            continue;

        switch (ifa->ifa_addr->sa_family)
        {
            case AF_INET:
            {
                struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr;
                in_addr = &s4->sin_addr;
                break;
            }

            case AF_INET6:
            {
                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr;
                in_addr = &s6->sin6_addr;
                break;
            }

            default:
                continue;
        }

        if (!inet_ntop(ifa->ifa_addr->sa_family, in_addr, buf, sizeof(buf)))
        {
            printf("%s: inet_ntop failed!\n", ifa->ifa_name);
        }
        else
        {
            printf("%s: %s\n", ifa->ifa_name, buf);
        }
    }

    freeifaddrs(myaddrs);
    return 0;
}
于 2010-01-27T11:47:39.367 に答える
-2

gethostname()を使用した後、ホスト名をに渡しますgethostbyname()

int gethostname(char *hostname, size_t size);
于 2011-11-19T16:59:51.417 に答える