[C / C ++:向上/向下查找默认网络接口的POSIX兼容方法

问题描述 投票:1回答:1

我正在POSIX平台(准确地说是PSE51)上工作。我想在默认网络接口打开/关闭(通过回调或通过连续轮询)时得到通知。面临的挑战是,我可以找到一种特定于Linux的方法来获取默认接口here,并且找到一种特定于Linux的方法来查找网络处于启动或关闭状态here,但无法找出一种POSIX方法来获取默认网络时的通知在C / C ++中,界面向上或向下。请提出建议。

c++ c linux posix
1个回答
1
投票

POSIX不提供这样的接口。

[许多POSIXy系统-Linux,BSD,许多Unix-确实提供了C函数getifaddrs(),该函数提供了指向getifaddrs()结构的链表的指针。如果列表中包含struct ifaddrs与您的接口名称匹配且->if_name与您的地址族(通常为->if_addr->sa_familyAF_INET)匹配的条目,则该接口已启动。否则,接口将关闭。

请考虑以下示例:

AF_INET6

如果系统上支持#include <sys/types.h> #include <sys/socket.h> #include <ifaddrs.h> #include <string.h> #include <errno.h> enum { IFACE_IPv4 = (1<<0), IFACE_IPv6 = (1<<1), IFACE_IP = (1<<0) | (1<<1), }; int iface_check(const char *name) { struct ifaddrs *curr, *list = NULL; int result = 0; if (!name || !(*name)) { errno = EINVAL; return 0; } if (getifaddrs(&list) == -1) return 0; for (curr = list; curr != NULL; curr = curr->ifa_next) { if (!strcmp(name, curr->ifa_name)) { if (curr->ifa_addr->sa_family == AF_INET) result |= IFACE_IPv4; if (curr->ifa_addr->sa_family == AF_INET6) result |= IFACE_IPv6; } } freeifaddrs(list); errno = 0; return result; } getifaddrs()功能(它们广泛可用),则用包含接口名称的freeifaddrs()调用ifa_check(name),如果接口关闭,则应返回0,以及以下各项的组合nameIFACE_IPv4(如果向上)(取决于它支持的地址系列)。

为了易于使用,如果没有发生错误,上述功能始终将IFACE_IPv6设置为零。这样,您可以只使用返回值(如果在IP / IPv6意义上为“ up”,则为非零)。如果返回零,则可以检查errno是否有错误。 (如果没有错误,则为零;该接口未在IPv4 / IPv6中列出。)

© www.soinside.com 2019 - 2024. All rights reserved.