【发布时间】:2011-02-11 02:37:03
【问题描述】:
请建议如何使用 C++ 和 Linux 获取我的系统的 IP 地址(逻辑地址)。
【问题讨论】:
标签: c++ linux ip-address
请建议如何使用 C++ 和 Linux 获取我的系统的 IP 地址(逻辑地址)。
【问题讨论】:
标签: c++ linux ip-address
我认为您可以使用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;
}
【讨论】:
“逻辑地址”没有意义。您要么需要一个接口地址(主机在与机器相同的本地网络上的 IP),要么需要面向公众的 Internet 地址(主机将在本机连接到它们时看到 IP 地址)。仅当机器直接连接到 Internet 时,IP 地址才会相同,但通常情况并非如此。
其次,Linux 主机可以(并且确实)有多个接口,因此哪个 接口同样重要。它可能与路由相关(在这种情况下取决于目的地),或者它可能使用策略路由(同样:将取决于实际流量)。
第三:Linux 主机可能有多个地址。也就是说,系统管理员可以通过使用子接口(例如ifconfig eth0:2 ...)或简单地添加辅助地址(例如ip addr add ip dev eth0)来将多个IP地址绑定到接口。
这就是为什么你最好的办法是告诉用户你想做什么,并要求用户给你正确的信息,或者尝试建立联系,然后依靠系统做正确的事。
对于您实际需要 IP 地址的少数情况(例如,如果您正在实施 FTP 客户端),专用方法将是正确的方法(在 FTP 客户端情况下:使用getsockname() 的结果在控制通道上)。准确了解您认为需要 IP 地址的原因(以及您拥有的信息)将有助于您获得更好的答案。
【讨论】:
您要求提供“该”IP 地址,但没有这样的东西。您的系统可以有任意数量的 IP 地址,即使您只有一个 NIC。对于初学者,您的 LAN 上至少有 127.0.0.1 和至少一个 IP。您需要弄清楚如何确定所需的接口,然后使用适当的库调用(我不记得了)来查找该接口的 IP。
【讨论】: