【问题标题】:Obtaining local IP address using getaddrinfo() C function?使用 getaddrinfo() C 函数获取本地 IP 地址?
【发布时间】:2010-01-27 10:53:03
【问题描述】:

我正在尝试使用 getaddrinfo() 函数获取我的本地(而不是外部)IP 地址,但我看到了here 提供的示例,它们对于我的需求来说太复杂了。还看了其他帖子,大部分都是想获取外部IP,而不是本地IP。

谁能提供一个简单示例(或简单示例)的链接,说明如何使用此功能获取我自己的本地 IP 地址?

当我说本地时要清楚,如果路由器是 192.168.0.1 ,我的本地 IP 地址可能类似于 192.168.0.x (只是一个例子)。

【问题讨论】:

  • getaddrinfo 被设计成在 ipv4 和 ipv6 之间有一个统一的接口,这就是它看起来有点复杂的原因。 (如果得到答案,我稍后会告诉你)
  • 谢谢! ,是的,它看起来很复杂,我不想使用 gethostbyname() 因为它似乎已被弃用...
  • 该页面上的最后一个示例是如何做到这一点......为什么这太复杂了?如果你真的只想要一个 IPv4 地址,请使用 AF_INET……但不要那样做,让它也支持 IPv6。
  • 如果您使用 C++,您是否考虑过使用 ASIO 网络库? asio.sourceforge.net
  • 感谢您的评论,我会检查一下!

标签: c++ c getaddrinfo


【解决方案1】:

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

【讨论】:

  • 这是我在这个问题上见过的最好的答案。
【解决方案2】:

使用gethostname()后将主机名传递给gethostbyname()

int gethostname(char *hostname, size_t size);

【讨论】:

  • 不,主机名可能无法解析。试图解决它是不好的。虽然这是一个常见的编程错误,所以一些系统通过返回“127.0.1.1”来保证主机名是可解析的,这样就不会出现错误。因此,您甚至不能依赖返回,因为它甚至可能不是有用的地址。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 2011-10-11
  • 1970-01-01
  • 2011-12-05
  • 2011-02-25
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多