【问题标题】:What type is socket type of value 0?值为 0 的套接字类型是什么类型?
【发布时间】:2021-01-24 16:37:22
【问题描述】:

我在 enum __socket_type 中看不到 socke 类型的值 0

socket_type.h

/* Types of sockets.  */
enum __socket_type
{
  SOCK_STREAM = 1,      /* Sequenced, reliable, connection-based
                   byte streams.  */
#define SOCK_STREAM SOCK_STREAM
  SOCK_DGRAM = 2,       /* Connectionless, unreliable datagrams
                   of fixed maximum length.  */
#define SOCK_DGRAM SOCK_DGRAM
  SOCK_RAW = 3,         /* Raw protocol interface.  */
#define SOCK_RAW SOCK_RAW
  SOCK_RDM = 4,         /* Reliably-delivered messages.  */
#define SOCK_RDM SOCK_RDM
  SOCK_SEQPACKET = 5,       /* Sequenced, reliable, connection-based,
                   datagrams of fixed maximum length.  */
#define SOCK_SEQPACKET SOCK_SEQPACKET
  SOCK_DCCP = 6,        /* Datagram Congestion Control Protocol.  */
#define SOCK_DCCP SOCK_DCCP
  SOCK_PACKET = 10,     /* Linux specific way of getting packets
                   at the dev level.  For writing rarp and
                   other similar things on the user level. */
#define SOCK_PACKET SOCK_PACKET

  /* Flags to be ORed into the type parameter of socket and socketpair and
     used for the flags parameter of paccept.  */

  SOCK_CLOEXEC = 02000000,  /* Atomically set close-on-exec flag for the
                   new descriptor(s).  */
#define SOCK_CLOEXEC SOCK_CLOEXEC
  SOCK_NONBLOCK = 00004000  /* Atomically mark descriptor(s) as
                   non-blocking.  */
#define SOCK_NONBLOCK SOCK_NONBLOCK
};

但是如果我不指定addrinfo struct 字段ai_socktype 怎么办?那么值是0,那是什么类型,当__socktype_type中没有这个类型的时候呢?

【问题讨论】:

    标签: c sockets getaddrinfo


    【解决方案1】:

    0 用于ai_socktype 表示“任何类型”。

    来自the manual pagegetaddrinfo

     The hints argument points to an addrinfo structure that specifies
           criteria for selecting the socket address structures returned in
           the list pointed to by res.  If hints is not NULL it points to an
           addrinfo structure whose ai_family, ai_socktype, and ai_protocol
           specify criteria that limit the set of socket addresses returned
           by getaddrinfo(), as follows:
    
           [...]
    
           ai_socktype
                  This field specifies the preferred socket type, for
                  example SOCK_STREAM or SOCK_DGRAM.  Specifying 0 in this
                  field indicates that socket addresses of any type can be
                  returned by getaddrinfo().
    

    "在该字段中指定0表示getaddrinfo()可以返回任意类型的socket地址。"

    【讨论】:

    • 但是,为什么 socktype 的值不是 0? AF_NONSPEC 用于家庭、0 端口或 0.0.0.0 主机,所有这些类型都有“零”作为特例。为什么 socktype 没有这种类型?
    • @milanHrabos 这是 Linux 内核开发人员的选择。端口 0 表示“任何端口”,地址 0.0.0.0 表示“任何地址”。但是,这些不在任何enum 中,因为所有可能的 16 位或 32 位值都是可能的。 enum 仅用于声明现有的套接字类型,而 0 不是其中之一,因此在 enum 中不声明它是有意义的,它只是一个用来表示“任何类型”的神奇值。跨度>
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2011-12-06
    • 2019-06-13
    相关资源
    最近更新 更多