使用C ++&获取我的系统的逻辑地址Linux的

时间:2010-04-22 14:23:32

标签: c++ linux ip-address

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

3 个答案:

答案 0 :(得分:8)

“逻辑地址”没有意义。您要么需要一个接口地址(在机器看到的同一本地网络上托管的IP),要么您需要面向公众的Internet地址(主机将在此计算机连接到它们时看到的IP地址)。如果机器直接连接到互联网,IP地址将是相同的,这通常是不正确的。

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

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

这就是为什么你最好的选择是告诉用户你想做什么,并要求用户给你正确的信息,或只是尝试建立连接,并依靠系统做正确的事。

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

答案 1 :(得分: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 :(得分:1)

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