为什么要比较sa_family,无符号整数,socket.h定义的结构与AF_INET比较

时间:2019-08-22 17:02:28

标签: c sockets

我正在读一本有关用C语言进行网络编程的书。其中一个示例程序(此处:https://github.com/codeplea/Hands-On-Network-Programming-with-C/blob/master/chap01/unix_list.c)将sa_family类型(它是无符号整数)与我猜测的枚举数进行了比较, AF_INET和AF_INET6。这是如何运作的?

我一直在查看socket.h和ifaddrs.h,但其中没有看到任何枚举。

int main() {

    struct ifaddrs *addresses;

    if (getifaddrs(&addresses) == -1) {
        printf("getifaddrs call failed\n");
        return -1;
    }

    struct ifaddrs *address = addresses;
    while(address) {
        int family = address->ifa_addr->sa_family;
        if (family == AF_INET || family == AF_INET6) {

            printf("%s\t", address->ifa_name);
            printf("%s\t", family == AF_INET ? "IPv4" : "IPv6");

            char ap[100];
            const int family_size = family == AF_INET ?
                sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6);
            getnameinfo(address->ifa_addr,
                    family_size, ap, sizeof(ap), 0, 0, NI_NUMERICHOST);
            printf("\t%s\n", ap);

        }
        address = address->ifa_next;
    }


    freeifaddrs(addresses);
    return 0;
}

第13行如何工作?如果(家庭== AF_INET ||家庭== AF_INET6)

谢谢!

3 个答案:

答案 0 :(得分:1)

您找不到任何枚举的原因是因为AF_INETAF_INET6不是“枚举器”。

但是您要查看的头文件是sys/socket.h。在其中,您会找到:

#define AF_INET         2               /* internetwork: UDP, TCP, etc. */
...
#define AF_INET6        30              /* IPv6 */

换句话说,AF_INETAF_INET6是数字-实际上是整数,就像sa_family类型一样。

知道它们是整数,我猜您现在可以确切地看到

if (family == AF_INET || family == AF_INET6)

有效。

答案 1 :(得分:1)

定义

Posix实际上specifies AF_INET是宏,因此在特定平台上,AF_INET可以定义为例如

#define AF_INET 16

这样的代码

 if (family == AF_INET) 

在预处理程序阶段之后将转换为字面上的代码if (family == 16)

枚举

如果是枚举,则没有太大的区别。

枚举只是一个整数,因此您可以将其与整数类型的变量进行比较。

假设有

enum SA_FAMILY {
   AF_INET,
   AF_INET6
   AF_UNIX
};

在这里,第一个枚举常量将具有整数值0,第二个枚举常量将具有值1,依此类推。

这意味着您可以将枚举常量与一个整数类型的变量进行比较(并且所谓的“通常的算术转换”规则规定了在各种情况下如何转换值,无论您是否使用{{ 1}},short int等。)

如果有

unsigned int

您也只是在做unsigned int family = 0; if (family == AF_INET) { ... }

答案 2 :(得分:0)

if (family == AF_INET || family == AF_INET6)

表示“如果family等于AF_INETfamily等于AF_INET6”。等于运算符的优先级高于逻辑或运算符。