C 関数 getaddrinfo() を使用してローカル IP アドレスを取得しますか?

StackOverflow https://stackoverflow.com/questions/2146191

  •  23-09-2019
  •  | 
  •  

質問

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

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

念のために言っておきますが、ローカルと言うとき、ルーターが 192.168.0.1 、ローカル IP アドレスは次のようになります。 192.168.0.x (ほんの一例です)。

役に立ちましたか?

解決

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;
}

他のヒント

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

int gethostname(char *hostname, size_t size);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top