На localhost, как выбрать номер свободного порта?

Я пытаюсь играть с межпроцессной связью, и поскольку я не мог понять, как использовать именованные каналы под Windows, я думал, что буду использовать сетевые сокеты. Все происходит локально. Сервер может запускать slaves в отдельном процессе и прослушивает некоторый порт. Рабы выполняют свою работу и подчиняют результат хозяину. Как выяснить, какой порт доступен? Я предполагаю, что не могу слушать порт 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 для этого?