Я пытаюсь поиграть с межпроцессным взаимодействием, и так как я не мог понять, как использовать именованные каналы под Windows, я думал, что буду использовать сетевые сокеты. Все происходит локально. Сервер может запускать ведомые в отдельном процессе и прослушивает какой-либо порт. Рабы выполняют свою работу и представляют результат мастеру. Как выяснить, какой порт доступен? Я предполагаю, что не могу слушать порт 80 или 21?
Я использую Python, если это сокращает выбор.
Спасибо!
Ответы:
Не привязывайте к определенному порту или привязывайте к порту 0, например
sock.bind(('', 0))
. Затем ОС выберет для вас доступный порт. Вы можете получить выбранный порт, используя егоsock.getsockname()[1]
, и передать его ведомым, чтобы они могли подключиться обратно.источник
sock.bind(('',0))
Ради того, что ребята объяснили выше:
источник
s.bind(('localhost', 0))
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket.SO_REUSEADDR
Действительно помогает в этом случае? Из того, что я прочитал, имеет значение только то, что имеет сокет, который пытается связать,SO_REUSEADDR
и не имеет значения, установлен ли этот флаг на длительном сокете.Свяжите сокет с портом 0. Будет выбран произвольный свободный порт от 1024 до 65535. Вы можете получить выбранный порт
getsockname()
сразу послеbind()
.источник
Вы можете слушать на любом порту, который вы хотите; Как правило, пользовательские приложения должны прослушивать порты 1024 и выше (через 65535). Главное, если у вас есть переменное число слушателей, это выделить диапазон для вашего приложения - скажем, 20000-21000, и CATCH EXCEPTIONS . Именно так вы узнаете, является ли порт непригодным (используется другим процессом, другими словами) на вашем компьютере.
Однако в вашем случае у вас не должно возникнуть проблем с использованием одного жестко закодированного порта для прослушивателя, если вы печатаете сообщение об ошибке в случае сбоя привязки.
Также обратите внимание, что большинство ваших сокетов (для подчиненных) не обязательно должны быть явно привязаны к определенным номерам портов - только сокеты, которые ждут входящих соединений (как, например, ваш ведущий здесь), должны быть сделаны слушателем и привязаны к порту. Если порт не указан для сокета до его использования, ОС назначит для него используемый порт. Когда мастер хочет ответить подчиненному, который отправляет ему данные, адрес отправителя становится доступным, когда слушатель получает данные.
Я полагаю, вы будете использовать UDP для этого?
источник
Если вам нужно только найти свободный порт для последующего использования, вот фрагмент, похожий на предыдущий ответ , но более короткий, с использованием socketserver :
Обратите внимание, что порт не гарантированно останется свободным, поэтому вам может потребоваться поместить этот фрагмент и код, использующий его, в цикл.
источник