Мне интересно, как ОС следит за тем, чтобы клиенты не получали тот же "случайный"(привязывающий сокет, устанавливая порт на 0) порт, как любой другой клиент в сети, поскольку я хочу общаться по протоколу UDP между моим сервером и множеством машин, использующих один и тот же локальный IP-адрес, было бы очень трудно, если бы клиенты получали пакеты друг от друга.
2 ответа
В ОС есть список используемых портов, обычно она просто выбирает следующий доступный. Тем не менее, он пытается избежать низких цифр.
Порты не должны быть уникальными в сети, только для каждого соединения. Соединение состоит из
- IP источника
- исходный порт
- IP-адрес назначения
- порт назначения
Если что-то из этого отличается, это другое соединение. Это означает, что на сервере может быть много подключений к одному и тому же порту с разных IP-адресов или с разных портов с одного и того же IP-адреса.
как ОС гарантирует, что клиенты не получат тот же "случайный"(привязывающий сокет, установив порт в 0) порт, как любой другой клиент в сети
Это не так. Это гарантирует, что локальные приложения получают уникальный порт в текущем хосте. Ничего общего с клиентами или сетью.
было бы очень сложно, если бы клиенты получали друг от друга пакеты.
Они этого не делают, если они не находятся на одном и том же хосте и намеренно используют один и тот же порт, но вам придется запрограммировать их оба, чтобы сделать это намеренно (т.е. установить SO_REUSEPORT на обоих сокетах).