首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++和Linux获取系统的逻辑地址

问使用C++和Linux获取系统的逻辑地址
EN

Stack Overflow用户
提问于 2010-04-22 22:23:32
回答 3查看 1K关注 0票数 0

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-22 22:33:51

“逻辑地址”没有任何意义。您要么想要一个接口地址(托管在与机器see相同的本地网络上的IP ),要么想要面向公众的Internet地址(此机器连接到主机时主机将看到的IP地址)。只有当机器直接连接到互联网时,IP地址才是相同的,这通常不是真的。

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

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

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

对于少数实际需要IP地址的情况(例如,如果您正在实现一个FTP客户端),一种特殊的方法将是正确的方法(在FTP客户端的情况下:在控制通道上使用getsockname()的结果)。确切地知道为什么你认为你需要IP地址(以及你有什么信息)将帮助你得到一个更好的答案。

票数 8
EN

Stack Overflow用户

发布于 2010-04-22 22:26:21

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

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2010-04-22 22:28:19

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2691650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档