我正在POSIX平台(准确地说是PSE51)上工作。我想在默认网络接口打开/关闭(通过回调或通过连续轮询)时得到通知。面临的挑战是,我可以找到一种特定于Linux的方法来获取默认接口here,并且找到一种特定于Linux的方法来查找网络处于启动或关闭状态here,但无法找出一种POSIX方法来获取默认网络时的通知在C / C ++中,界面向上或向下。请提出建议。
POSIX不提供这样的接口。
[许多POSIXy系统-Linux,BSD,许多Unix-确实提供了C函数getifaddrs()
,该函数提供了指向getifaddrs()
结构的链表的指针。如果列表中包含struct ifaddrs
与您的接口名称匹配且->if_name
与您的地址族(通常为->if_addr->sa_family
和AF_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,以及以下各项的组合name
和IFACE_IPv4
(如果向上)(取决于它支持的地址系列)。
为了易于使用,如果没有发生错误,上述功能始终将IFACE_IPv6
设置为零。这样,您可以只使用返回值(如果在IP / IPv6意义上为“ up”,则为非零)。如果返回零,则可以检查errno
是否有错误。 (如果没有错误,则为零;该接口未在IPv4 / IPv6中列出。)