繁体   English   中英

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

[英]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_INETAF_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_IPv4IFACE_IPv6的组合如果向上(取决于它支持哪个地址系列)。

为了便于使用,上面的 function 如果没有发生错误,总是将errno为零。 这样,您可以只使用返回值(如果在 IP/IPv6 意义上“向上”,则为非零)。 如果它返回零,您可以检查errno是否有错误。 (如果没有错误,它将为零;该接口只是没有与 IPv4/IPv6 一起列出。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM