Наткнулся в listen(2) на такую строчку:
Creation of socket-based connections requires several operations. First, a socket is created with socket(2). Next, a willingness to accept incoming connections and a queue limit for incoming connections are specified with listen(). Finally, the connections are accepted with accept(2).
То есть bind() как бы и не нужен. Решил проверить — и правда, listen() сразу после socket(PF_INET6) прибивает сокет к tcp46 *:random, netstat подтверждает. Хотя в стандарте об этом как-то не упоминается, хоть и подразумевается, что bind() это лишь попытка привязки сокета к адресу, в принципе отдельная от его использования. Для connect() такое поведение описано прямо в стандарте, для listen() — нет.
Вопрос звучит так: насколько это распространено, стандартно, и не является ли это лучшим способом в общем виде забиндиться на tcp46 *:random, чем, например:
struct sockaddr_in6 sa = { 0 };
sa.sin6_len = sizeof(sa);
sa.sin6_family = AF_INET6;
sa.sin6_port = 0;
sa.sin6_addr = in6addr_any;
?