Как присваиваются динамические порты в UDP протоколе?
Допустим я создал UDP сокет и через sendto отправил на сервер датаграмму.
Сервер может увидеть адрес и порт отправителя в загаловке датаграммы и отправить ответ.
Этот порт был назначен клиентом динамически.
Собственно вопрос. Когда просиходит назначения порта, сразу при создании сокета или в момент вызова функции sendto?
Этот порт остаентся неизменным на протяжении жизни сокета или может измениться?
И как долго этот порт будет оставаться открытым и я смогу получать на него сообщения от сервера? До тех пор, пока я его сам не закрою через close/closesocket?
Ответы (1 шт):
Когда просиходит назначения порта, сразу при создании сокета или в момент вызова функции sendto?
Когда просто создан сокет, ещё не понятно, что с ним делать. А вот когда происходит отправка (или программист явно позвал bind), то система выделяет реальный адрес-порт. Да, функция отправки для udp или connect для tcp внутри вызовет bind.
Этот порт остаентся неизменным на протяжении жизни сокета или может измениться?
Он остается за сокетом. Я не знаю о команде "unbind". А вот когда сокет будет закрыт, тогда и будет разорвана связь сокет-адрес:порт.
И как долго этот порт будет оставаться открытым и я смогу получать на него сообщения от сервера
До тех пор, пока Вы держите сокет открытым (ну и приложение запущено). Но тут есть хитрый момент. Если используется "пробивание NAT", то роутер также хранит привязку локальный-адрес:порт - внешний-адрес:порт. И вот сколько он будет хранить эту привязку - это уже отдельная тема. Ведь он не знает, что соединение закрыто или нет. Если идет постоянный обмен - соединение продолжает быть открытым и порты не меняются. Если обмен остановился - роутер может удалить эту привязку и сервер будет слать, и клиент будет ждать, но вот роутер не будет пересылать.
Как присваиваются динамические порты в UDP протоколе?
Если порт явно не указан или номер порта указан как 0, то операционная система выбирает любой свободный порт с диапазона 49152-65535 - https://docs.microsoft.com/ru-ru/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang