Подтвердить что ты не робот

На локальном хосте, как мне выбрать номер порта?

Я пытаюсь играть с межпроцессорной связью, и поскольку я не мог понять, как использовать именованные каналы под Windows, я думал, что буду использовать сетевые сокеты. Все происходит локально. Сервер может запускать ведомые устройства в отдельном процессе и прослушивать некоторые порты. Рабы выполняют свою работу и передают результат мастеру. Как узнать, какой порт доступен? Я предполагаю, что не могу слушать порт 80 или 21?

Я использую Python, если это сокращает выбор.

Спасибо!

4b9b3361

Ответ 1

Не привязывайтесь к определенному порту или привязывайтесь к порту 0, например. sock.bind(('', 0)). Затем ОС выберет для вас доступный порт. Вы можете получить порт, который был выбран с помощью sock.getsockname()[1], и передать его подчиненным устройствам, чтобы они могли подключиться обратно.

Ответ 2

Привяжите сокет к порту 0. Будет выбран случайный свободный порт от 1024 до 65535. Вы можете получить выбранный порт с помощью getsockname() сразу после bind().

Ответ 3

Ради фрагмента того, что ребята объяснили выше:

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))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]

Ответ 4

Вы можете прослушивать любой порт, который вы хотите; обычно пользовательские приложения должны прослушивать порты 1024 и выше (через 65535). Главное, если у вас есть переменное количество слушателей, это выделить диапазон для вашего приложения - например, 20000-21000 и CATCH EXCEPTIONS. Таким образом вы узнаете, неприменим ли порт (используемый другим процессом, другими словами) на вашем компьютере.

Однако в вашем случае у вас не должно быть проблемы с использованием одного жестко закодированного порта для вашего слушателя, если вы печатаете сообщение об ошибке, если сбой не выполняется.

Обратите внимание также, что большинство ваших сокетов (для ведомых устройств) не обязательно должны быть привязаны к конкретным номерам портов - только сокеты, которые ждут входящих соединений (например, ваш мастер здесь), должны быть сделаны слушателем и привязаны к порт. Если порт не указан для сокета до его использования, ОС назначит доступный порт для сокета. Когда мастер хочет ответить на ведомое устройство, которое отправляет его, адрес отправителя доступен, когда слушатель получает данные.

Я полагаю, вы будете использовать UDP для этого?