Я хочу получить любой случайный открытый порт TCP на localhost в Python. Каков самый легкий путь?
Мое текущее решение:
def get_open_port():
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("",0))
s.listen(1)
port = s.getsockname()[1]
s.close()
return port
Не очень хорошее и не на 100% правильное, но пока оно работает.
Я действительно использую следующее в одной из моих программ:
port = random.randint(10000,60000)
Конечно, это даже более подвержено конфликтам, чем ваш код. Но у меня никогда не было с этим проблем. Дело в том, что в любой момент времени большинство из этих портов с высокими номерами не используются, и если вы просто выберете один наугад, конфликт с другим процессом маловероятен. Если вы сделаете что-то вроде решения, которое вы опубликовали в своем ответе (открытие сокета и получение номера его порта), почти наверняка порт не будет конфликтовать. Так что, если это то, что вы будете использовать только для себя (в отличие от того, что вы собираетесь выпустить для публики), подумайте, стоит ли придумывать действительно пуленепробиваемое решение. Скорее всего, это никогда не изменит ситуацию.
По мотивам комментария Марсело Кантоса по вашему вопросу, я добавлю, что стандартное решение в подобных случаях - привязать процесс, который будет использовать порт, к нему, а затем поделиться этой информацией с любой другой программой, которая в ней нуждается. . Обычно он делает что-то вроде записи временного файла, содержащего номер порта, в какое-то стандартное место в файловой системе. Поскольку процесс, с которым вы работаете, этого не делает, в каком-то смысле любое решение, которое вы придумаете, будет чем-то вроде взлома. Но опять же, если это просто для вашего собственного использования, это, вероятно, нормально.