bind() - как вызвать bind () несколько раз в одном сокете
Я использую bind() для адреса, для которого я установил значение порта равным 0. Я знаю, что таким образом он связывает случайный порт с адресом. Но я хочу, чтобы только порт со значением x, таким, что (x >= 0 && x <= 1023) || (x >= 49152) были выбраны, но я заметил, что среди случайных портов, которые могут быть выбраны, есть также порт> 49152 . Однако, если я повторно вызову bind(), он выдаст ошибку: неверный аргумент. Как я могу повторно вызвать функцию bind(), если она не выдает ошибку неверного аргумента, или как решить эту проблему другим способом? Заранее большое спасибо.
2 ответа
Вы не можете позвонить bind()
снова на сокете, который уже связан. Как только сокет связан, его привязка не может быть изменена.
Привязка к порту 0 будет привязана к доступному случайному эфемерному порту, а диапазон эфемерных портов контролируется ОС, а не приложением. Некоторые операционные системы предоставляют значения конфигурации для установки диапазона, но вы должны быть администратором, чтобы изменить его.
Чтобы сделать то, что вы ищете, не привязывайте к порту 0 вообще. Вместо этого привязывайте к определенному желаемому порту, и если он недоступен, bind()
не удастся, и вы можете обработать ошибку, позвонив bind()
снова с другим портом, повторяя по мере необходимости, пока привязка не будет успешной или вы не исчерпали свой список желаемых портов.
Ты не можешь Вы должны закрыть сокет и начать снова. Вы не можете быть настолько требовательны к тому, какой порт вы получите. Они дадут вам все, что дадут вам.