LINUX.ORG.RU

listen, do not bind

 , ,


0

0

Наткнулся в 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;

?

Покопавшись в сети нашел, что как минимум винда возвращает ошибку на листен без бинда, и в линукс мануалах тоже не упоминается такое использование. Видимо, bsd-specific.

arturpub ★★
() автор топика

Как я понимаю, нужен или не нужен bind() и для чего, определяется внутри каждого эээ... семейства адресов.

AF_INET - «Если процесс хочет принимать новые входящие пакеты или соединения, то он должен связать сокет с адресом локального интерфейса, используя bind(2)»

AF_UNIX - «Локальный адрес может быть задан с помощью bind(2). Если сокет соединен и не имеет локального адреса, то в абстрактном пространстве имен автоматически будет создано уникальное имя.»

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.