На localhost, как мне выбрать номер свободного порта?
Я пытаюсь играть с межпроцессным взаимодействием, и поскольку я не мог понять, как использовать именованные каналы под Windows, я думал, что буду использовать сетевые сокеты. Все происходит локально. Сервер может запускать ведомые устройства в отдельном процессе и прослушивает некоторые порты. Рабы выполняют свою работу и представляют результат хозяину. Как узнать, какой порт доступен? Я предполагаю, что я не могу слушать на порту 80 или 21?
Я использую Python, если это сокращает выбор вниз.
спасибо!
4 ответов:
не привязывать к определенному порту, или привязать к Порту 0, например
sock.bind(('', 0)). Затем ОС выберет для вас доступный порт. Вы можете получить порт, который был выбран с помощьюsock.getsockname()[1], и передать его на рабов так, что они могут подключить обратно.
привязать сокет к Порту 0. Будет выбран случайный Свободный порт от 1024 до 65535. Вы можете получить выбранный порт с
getsockname()сразу послеbind().
ради фрагмента того, что ребята объяснили выше:
import socket from contextlib import closing def find_free_port(): with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: s.bind(('', 0)) return s.getsockname()[1]
вы можете слушать на любом порте вы хотите; как правило, пользовательские приложения должны слушать порты 1024 и выше (через 65535). Главное, если у вас есть переменное количество слушателей, чтобы выделить диапазон для вашего приложения-скажем, 20000-21000, и ПОЙМАТЬ ИСКЛЮЧЕНИЯ. Именно так вы будете знать, если порт непригоден (используется другим процессом, другими словами) на вашем компьютере.
однако в вашем случае у вас не должно быть проблем с использованием одного жесткого порта для вашего слушателя, пока вы печатаете сообщение об ошибке, если привязка не выполняется.
обратите внимание также, что большинство ваших сокетов (для ведомых устройств) не должны быть явно привязаны к определенным номерам портов - только сокеты, которые ждут входящих соединений (например, ваш мастер здесь), должны быть сделаны слушателем и привязаны к порту. Если порт не указан для сокета до его использования, ОС назначит сокету используемый порт. Когда хозяин хочет ответить рабу, который отправляет это данные, адрес отправителя доступен, когда слушатель получает данные.
Я предполагаю, что вы будете использовать UDP для этого?
Comments