簡體   English   中英

為什么要比較sa_family,無符號整數,socket.h定義的結構與AF_INET比較

[英]Why can you compare sa_family, an unsigned integer, a struct defined by socket.h be compared to AF_INET

我正在閱讀有關使用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)

謝謝!

您找不到任何枚舉的原因是因為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)

作品。

限定

Posix實際上指定 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,依此類推。

這意味着您可以將枚舉常量與一個整數類型的變量進行比較(其中所謂的“通常的算術轉換”規則規定了在各種情況下如何轉換值,無論您是否使用short intunsigned int等。)

所以如果你有

unsigned int family = 0;

if (family == AF_INET) {
...
}

您也只是在做if (family == 0)

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

意思是“如果family等於AF_INETfamily等於AF_INET6 ”。 等於運算符的優先級高於邏輯或運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM