Получить случайный, большой номер порта, который все еще доступен - PullRequest
9 голосов
/ 04 июня 2009

Предположим, я хочу запустить службу TCP / IP на каком-либо порту для IPC. Поскольку я передаю номер порта процессам, с которыми я все равно хочу общаться, номер порта не имеет значения. Какой лучший способ получить случайный, высокий (обычно> 49152) номер порта, который все еще доступен в системе? Есть ли в POSIX что-то, что я могу использовать?

Я знаю, что FTP-серверам это нужно часто.

Ответы [ 5 ]

14 голосов
/ 04 июня 2009

Если вы не укажете номер порта, ОС автоматически выберет для вас эфемерный порт .

С Выбор номера порта :

Новое серверное программное обеспечение следует стараться избегать в зависимости от конкретного номера порта, особенно если это программное обеспечение уровня пользователя, которое неизбежно не связано с известным портом. К счастью, это легко сделать, запросив порт 0, который дает системе команду выбрать временный номер порта.

6 голосов
/ 04 июня 2009

Эфемерные порты могут сделать это. Ваша ОС назначит вам порт из пула свободных портов.

Существует некоторый код C, лицензированный BSD, который делает это здесь

В Python вы можете указать ('', 0) socket.AF_INET адресную пару для той же цели, например sock.bind(('', 0))

2 голосов
/ 08 мая 2015

Если вы попытаетесь привязать порт 0, система свяжет ваш сокет с «эфемерным» случайным портом. Затем вы можете получить порт с getsockname (в C).

В рубине:

s = TCPServer.new('localhost', 0) #You can also use nil instead of 0
s.addr[1] #The obtained port number
0 голосов
/ 20 июля 2014

Вы можете использовать мою маленькую библиотеку C: https://github.com/yegor256/random-tcp-port

Скомпилируйте его и запустите на своем компьютере. Будет выведен произвольный доступный порт TCP.

0 голосов
/ 04 июня 2009

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

...