[英]What does the declarations {sa_family=AF_UNIX} and [110->2] mean in accept4?
[英]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_INET
和AF_INET6
不是“枚舉器”。
但是您要查看的頭文件是sys/socket.h
。 在其中,您會發現:
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
...
#define AF_INET6 30 /* IPv6 */
換句話說, AF_INET
和AF_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 int
, unsigned int
等。)
所以如果你有
unsigned int family = 0;
if (family == AF_INET) {
...
}
您也只是在做if (family == 0)
。
if (family == AF_INET || family == AF_INET6)
意思是“如果family
等於AF_INET
或family
等於AF_INET6
”。 等於運算符的優先級高於邏輯或運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.