【问题标题】:Getting Logical address of my system using C++ & Linux使用 C++ 和 Linux 获取我的系统的逻辑地址
【发布时间】:2011-02-11 02:37:03
【问题描述】:

请建议如何使用 C++ 和 Linux 获取我的系统的 IP 地址(逻辑地址)。

【问题讨论】:

标签: c++ linux ip-address


【解决方案1】:

我认为您可以使用int getifaddrs(struct ifaddrs **ifap); 来获取此数据。阅读man 3 getifaddrs 了解更多信息。它可能看起来像:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>

int main(void) {
    struct ifaddrs *ifap, *cur;

    getifaddrs(&ifap);

    for(cur = ifap; cur != NULL; cur = cur->ifa_next) {
        if(cur->ifa_addr->sa_family != AF_INET)
            continue;

        printf("address value: %s, name: %s\n",
               cur->ifa_addr->sa_data,
               cur->ifa_name);
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    “逻辑地址”没有意义。您要么需要一个接口地址(主机在与机器相同的本地网络上的 IP),要么需要面向公众的 Internet 地址(主机将在本机连接到它们时看到 IP 地址)。仅当机器直接连接到 Internet 时,IP 地址才会相同,但通常情况并非如此。

    其次,Linux 主机可以(并且确实)有多个接口,因此哪个 接口同样重要。它可能与路由相关(在这种情况下取​​决于目的地),或者它可能使用策略路由(同样:将取决于实际流量)。

    第三:Linux 主机可能有多个地址。也就是说,系统管理员可以通过使用子接口(例如ifconfig eth0:2 ...)或简单地添加辅助地址(例如ip addr add ip dev eth0)来将多个IP地址绑定到接口。

    这就是为什么你最好的办法是告诉用户你想做什么,并要求用户给你正确的信息,或者尝试建立联系,然后依靠系统做正确的事。

    对于您实际需要 IP 地址的少数情况(例如,如果您正在实施 FTP 客户端),专用方法将是正确的方法(在 FTP 客户端情况下:使用getsockname() 的结果在控制通道上)。准确了解您认为需要 IP 地址的原因(以及您拥有的信息)将有助于您获得更好的答案。

    【讨论】:

      【解决方案3】:

      您要求提供“该”IP 地址,但没有这样的东西。您的系统可以有任意数量的 IP 地址,即使您只有一个 NIC。对于初学者,您的 LAN 上至少有 127.0.0.1 和至少一个 IP。您需要弄清楚如何确定所需的接口,然后使用适当的库调用(我不记得了)来查找该接口的 IP。

      【讨论】:

        猜你喜欢
        • 2012-02-16
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多