Почему сокету нельзя сделать bind() к двум портам?
От: PlushBeaver  
Дата: 03.06.15 22:08
Оценка: 3 (1)
Интересует именно почему есть такое ограничение, как оно технически обосновывается. Про "сырые" сокеты и мультиплексирование мне известно.

Как я понимаю, порты в принципе придуманы, чтобы разделить службы, соединения и т. п. на одном узле. Ограничение "один порт — один узел" выглядит в этом свете логичным. Но при этом есть SO_REUSEADDR, позволяющая нескольким сокетам привязываться к одной и той же паре (адрес, порт). А вот возможности привязать один сокет к нескольким портам нет, хотя, казалось бы, это шанс сэкономить системный вызов (мультиплексор) и ресурсы (дополнительные сокеты), упрощение программирования, способ сделать какое-никакое резервирование.

RFC 768 (UDP) такого ограничения не накладывает. RFC 4960 (SCTP) требует использовать одинаковый порт для всех адресов на одном конце ассоциации (п. 1.2), хотя непонятно, зачем это нужно. Понятно, почему TCP требует одного порта — по определению своего соединения:

[Port] concatenated with the network and host addresses from the internet communication layer, this forms a socket. A pair of sockets uniquely identifies each connection.

UDP интересует больше всего.

Попытка чтения исходников Linux:

Подскажите, пожалуйста, какую реальную причину я упускаю.
сокет bind порт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.