有人在Get the IP address of the machine的答案中建议,可以使用getifaddrs()
来获取程序运行的机器的IP地址,效果很好:D:D
但是,在两个不同的系统上运行相同的程序,一个显示
SERVER_ADDRESS lo 127.0.0.1
SERVER_ADDRESS eth0 129.xxx.xxx.xxx
SERVER_ADDRESS virbr0 192.zzz.zzz.1
而另一个显示
SERVER_ADDRESS lo0 127.0.0.1
SERVER_ADDRESS en0 192.yyy.yyy.yyy
我打算使用strcmp
来区分以太网,但现在我意识到它不能跨系统工作,因为可能会打印出不同的字符串。
是否有功能(或更好的方法)来检查ifa_name
是否是以太网?
答案 0 :(得分:7)
要(再次)明确说明:127.0.0.0/255.0.0.0
net(范围)的所有地址,因为有127.0.0.0
到127.255.255.255
的地址,被定义为被视为本地环回地址。发往此类的数据不会离开本地机器。
无论如何,因为你已经在使用getifaddrs()
直播了很简单.. - 只需测试ifa_flags
为struct ifaddrs
返回的结构IFF_LOOPBACK
的成员#include <sys/types.h>
#include <ifaddrs.h>
#include <net/if.h> /* for IFF_LOOPBACK */
...
struct ifaddrs * pIfAddrs = NULL;
if (!getifaddrs(&pIfAddrs)) {
/* Test if the first interface is looping back to the local host. */
int iIsLoopBack = (0 != (pIfAddrs->ifa_flags & IFF_LOOPBACK));
...
}
...
/* clean up */
if (pIfAddrs) {
freeifaddrs(pIfAddrs);
pIfAddrs = NULL;
}
...
,如下所示:
{{1}}
答案 1 :(得分:2)
你可能遇到的不仅仅是那个问题..例如,有多个网卡,vLAN,看起来像LANS的WANS,反之亦然等等。
知道什么? 127.X.X.X
抛弃那个结果,你就得到了非环回。
如果您想知道地址是否为私人地址.. you'll then have to go down this road.
答案 2 :(得分:1)
/* Output:
Name: 'eth0' Addr: 'xxx.xxx.xxx.xxx'
Name: 'eth0:0' Addr: 'xxx.xxx.xxx.xxx'
*/
struct ifaddrs *ifaddr;
char ip[255];
if (getifaddrs(&ifaddr) == -1)
{
//sprintf(ip[0], "%s", strerror(errno));
}
else
{
struct ifaddrs *ifa;
int i = 0, family;
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
{
if (ifa->ifa_addr == NULL)
{
continue;
}
family = ifa->ifa_addr->sa_family;
if (family == AF_INET || family == AF_INET6)
{
if(!(ifa->ifa_flags & IFF_LOOPBACK) && (family == AF_INET) && getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), ip, NI_MAXHOST, NULL, 0, NI_NUMERICHOST) == 0)
{
printf("Name: '%s' Addr: '%s'\n", ifa->ifa_name, ip);
}
}
}
}
freeifaddrs(ifaddr);