我知道这个问题以某种形式被问了一百万次,但没有一个问题给出了符合POSIX标准的方法。
我需要获取计算机的本地网络地址,不使用 getifaddrs
或其他非POSIX兼容的接口方式。这是否可能?
虽然没有直接支持此事的选项,但您可以使用UDP套接字(SOCK_DGRAM
)将其连接到已知的远程地址。由于UDP套接字是无状态的,因此不会产生任何网络流量。
然后,您可以查询该套接字的本地端点(getsockname
)以获取通过您的系统路由的本地IP地址。同样,由于UDP是无状态的,因此这只是查询您的本地路由表,不产生任何真正的网络流量。
在此之后别忘了关闭套接字。
远程公共名称服务器非常适合此目的。您可以测试它们的几种可能性:
8.8.8.8
是一个容易记住的地址。 - R.. GitHub STOP HELPING ICE不,这是不可能的,因为posix没有指定访问该信息的API。
Unix通常支持getifaddrs或SIOCGIFCONF ioctl,因此请使用其中之一或其他系统相关API。请注意,一台机器上可能有(并且通常有)多个网络接口,您需要确定您感兴趣的接口。
SIOCGIFCONF
的 Unix。 - cnicutarPOSIX没有“网络”的概念,更不用说IP了。所以不行。
此外,一台机器可以有很多网络地址(至少回环地址,每个网络卡至少一个或多个IPv6地址等),“网络地址”也没有明确定义。
#include <unistd.h>
int main(int argc, char* argv[]) {
return 8 == write(1, "0.0.0.0\n", 8) ? 0 : 1;
}
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("127.0.0.1\n");
}
127
地址,127.0.0.0
是一个A类网络。只有对于IPv6,::1
才始终是一个有效的地址。 - Jens Gustedt
127.0.0.1
或::1
,但也可能是其他值),以及一个或多个实际的网络接口,每个接口都有一个或多个IPv4和IPv6地址(或其他协议)。如果您只想处理一个地址,您要么需要使用一些启发式方法选择其中一个,要么让用户决定她想要使用哪个地址。 - Holger Justsystem("ifconfig eth1 | grep 'inet addr' | cut -d ':' -f 2 | cut -d ' ' -f 1")
或者popen()
。 - pmgifconfig
非常标准并且是当前最好的方法,但一些Linux发行版如今开始不再提供ifconfig
, 而只提供iproute2
. 个人而言,我会选择SIOCGIFCONF
。 - cnicutar