Быстрый способ проверить, используется ли порт с использованием Python - PullRequest
8 голосов
/ 18 марта 2010

У меня есть сервер Python, который прослушивает пару сокетов. При запуске я пытаюсь подключиться к этим сокетам перед прослушиванием, поэтому я могу быть уверен, что больше ничего не использует этот порт. Это добавляет примерно три секунды к запуску моего сервера (что составляет около 0,54 секунды без теста), и я хотел бы урезать его. Поскольку я тестирую только localhost, я думаю, что время ожидания около 50 миллисекунд более чем достаточно для этого. К сожалению, метод socket.setdefaulttimeout (50) по какой-то причине не работает.

Как я могу урезать это?

Ответы [ 6 ]

11 голосов
/ 14 февраля 2016

Вот пример того, как проверить, занят ли порт.

import socket, errno

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    s.bind(("127.0.0.1", 5555))
except socket.error as e:
    if e.errno == errno.EADDRINUSE:
        print("Port is already in use")
    else:
        # something else raised the socket.error exception
        print(e)

s.close()
10 голосов
/ 18 октября 2018

Для проверки порта используйте:

def is_port_in_use(port):
    import socket
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        return s.connect_ex(('localhost', port)) == 0

источник: https://codereview.stackexchange.com/questions/116450/find-available-ports-on-localhost

9 голосов
/ 18 марта 2010

Как насчет того, чтобы просто попытаться подключиться к нужному порту и обработать ошибку, если порт занят? (Если проблема в том, что вы можете запустить один и тот же сервис дважды, не смотрите на открытые порты.)

Это разумный способ также избежать возникновения состояния гонки, как @eemz сказал в другом ответе.

1 голос
/ 18 марта 2010

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

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

1 голос
/ 18 марта 2010

Вы на Linux? Если это так, возможно, ваше приложение может запустить netstat -lant (или netstat -lanu, если вы используете UDP) и посмотреть, какие порты используются. Это должно быть быстрее ...

0 голосов
/ 23 мая 2018

Вот реализация ответа Мокса, которая работает для меня:

import subprocess
port = 5000
print(len(subprocess.Popen("netstat -lant | awk '{print $4}' | grep 0.0.0.0:" + str(port), shell=True, stdout=subprocess.PIPE).stdout.read()) > 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...