请建议如何使用C++和Linux获取系统的IP地址(逻辑地址)。
发布于 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地址(以及你有什么信息)将帮助你得到一个更好的答案。
发布于 2010-04-22 22:26:21
我认为您可以使用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;
}发布于 2010-04-22 22:28:19
你想要“那个”IP地址,但是根本没有这个东西。您的系统可以有任意数量的IP地址,即使您只有一个NIC也是如此。对于初学者来说,您的LAN上至少有127.0.0.1和至少一个IP。您需要弄清楚如何确定所需的接口,然后使用适当的库调用(我想不起来了)来查找该接口的IP。
https://stackoverflow.com/questions/2691650
复制相似问题