Ответ Реми Лебо хорош, если вам нужен временный порт. Это не очень хорошо, если вам нужен постоянный зарезервированный порт, потому что другое программное обеспечение также использует тот же метод для получения порта (включая стек TCP ОС, которому нужен новый временный порт для каждого соединения).
Так может произойти следующее:
- Вы вызываете bind с 0 и getsockname (), чтобы получить порт;
- затем сохраните его в конфигурации (или в нескольких конфигах) для использования в будущем;
- Программное обеспечение, которому нужен этот порт, запускается и связывает порт.
Тогда вам нужно, например, перезапустите программное обеспечение:
- программное обеспечение останавливает и отменяет привязку порта: теперь порт можно вернуть через bind (0) и getsockname () снова;
- например. Стеку TCP нужен порт и он привязывает ваш порт;
- Программное обеспечение не может запуститься, потому что порт уже связан.
Таким образом, для «будущего использования» вам нужен порт, который не находится в эфемерном диапазоне портов (это диапазон, из которого bind (host, 0) возвращает порт).
Мое решение для этой проблемы - утилита командной строки port-for .