我不了解inet / netinet / in.h的宏

时间:2019-07-16 16:29:53

标签: c macros

我正在使用C语言进行软件驱动程序的IPv6迁移,并且我想了解 IN6ADDR_ANY_INIT IN6ADDR_LOOPBACK_INIT 的以下宏。请帮助:

/* Copyright (C) 1991-2019 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef        _NETINET_IN_H
#define        _NETINET_IN_H        1
#include <features.h>
#include <bits/stdint-uintn.h>
#include <sys/socket.h>
#include <bits/types.h>

.
.
.

#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }

2 个答案:

答案 0 :(得分:3)

这些是COM10的初始化程序。 standard要求struct in6_addr至少具有单个成员struct in6_addr,该成员必须为s6_addr

大多数情况下,uint8_t[16]被实现为包含8、16和32位整数数组的嵌套联合以优化访问。例如,glibc具有

struct in6_addr

和访问器定义

struct in6_addr {
  union {
    uint8_t __u6_addr8[16];
    uint16_t __u6_addr16[8];
    uint32_t __u6_addr32[4];
  } __in6_u;
};

请记住,联合初始化程序需要使用自己的大括号并在联合的第一个成员上进行操作。最外层的#define s6_addr __in6_u.__u6_addr8 是该结构所必需的,下一层{}是联合的,而最内层的{}是数组初始化程序的。

因此

{}

#define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }

0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 

#define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }

答案 1 :(得分:1)

The man page很好地解释了。

  

要将AF_INET6套接字绑定到任何进程,本地地址应   从in6addr_any类型的in6_addr变量中复制。   在静态初始化中,也可以使用 IN6ADDR_ANY_INIT ,   扩展为一个常数表达式。他们俩都在网络中   字节顺序。 IPv6环回地址(::1)在   全局in6addr_loopback变量。对于初始化,   应该使用 IN6ADDR_LOOPBACK_INIT 。通过使用v4映射到v6的地址类型,可以使用v6 API处理IPv4连接。   因此程序只需要支持此API类型即可支持   协议。这由地址处理透明地处理   C库中的函数。