请建议如何使用C ++和Linux获取系统的IP地址(逻辑地址)。
答案 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。