[英]C/C++: POSIX compatible way to find default network interface up/down
我正在使用 POSIX 平台(确切地说是 PSE51)。 我想在默认网络接口启动/关闭时收到通知(通过回调或通过连续轮询)。 挑战在于,我可以在这里找到一种 linux 特定的方式来获取默认接口,并找到一种 linux 特定的方式来查找网络在此处启动或关闭,但无法找到一种 POSIX 方式来在默认网络接口启动或在 C/C++ 中。 请建议。
POSIX 不提供这样的接口。
许多 POSIXy 系统——Linux、BSD、许多 Unix——确实提供了 C function 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()
函数(它们被广泛使用),使用包含接口名称的name
调用ifa_check(name)
,如果接口关闭,则应返回 0,以及IFACE_IPv4
和IFACE_IPv6
的组合如果向上(取决于它支持哪个地址系列)。
为了便于使用,上面的 function 如果没有发生错误,总是将errno
为零。 这样,您可以只使用返回值(如果在 IP/IPv6 意义上“向上”,则为非零)。 如果它返回零,您可以检查errno
是否有错误。 (如果没有错误,它将为零;该接口只是没有与 IPv4/IPv6 一起列出。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.