1

I cannot see a socke type of value 0 in enum __socket_type:

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
};

But what if I do not specify addrinfo struct field ai_socktype? Then the value is 0, and what kind of type is that, when there is no such type in __socktype_type?

milanHrabos
  • 2,010
  • 3
  • 11
  • 45

1 Answers1

3

Using 0 for ai_socktype means "any type".

From the manual page for getaddrinfo:

 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().

"Specifying 0 in this field indicates that socket addresses of any type can be returned by getaddrinfo()."

Marco Bonelli
  • 63,369
  • 21
  • 118
  • 128
  • but still, why is not socktype with value of 0? AF_NONSPEC for family, 0 port or 0.0.0.0 host all all of these types have "zero" as a special case. Why does socktype have no such type? – milanHrabos Jan 24 '21 at 19:41
  • @milanHrabos that was the choice of the Linux kernel developers. Port 0 means "any port" and address 0.0.0.0 means "any address". Those are not in any `enum` though, since all the possible 16bit or 32bit values are possible. The `enum` only serves to declare the existing socket types, and 0 is not one of them, so it makes sense to not declare it in the `enum`, it's just a magic value used to mean "any type". – Marco Bonelli Jan 24 '21 at 20:03