1

Я использую команду os.system ("ping 192.168.178.5") для проверки связи с машиной. Забавно, я получаю код выхода 0, даже если пинг не удается.

Как я могу получить то, что говорит мне о сбое проверки связи / хост не в сети?

2 ответа2

3

Я не пользователь Python, но можно найти много материала по этой проблеме.

Например, пост pinging в локальной сети на python содержит два решения, которые я воспроизвожу здесь (не проверено).

Решение 1. Анализ выходных данных команды ping.

import subprocess

hostname = "10.20.16.30"
output = subprocess.Popen(["ping.exe",hostname],stdout = subprocess.PIPE).communicate()[0]

print(output)

if ('unreachable' in output):
    print("Offline")

Можно также проверить этот способ на "Время ожидания запроса".

Решение 2. Использование сокета (адаптировано из оригинального кода, поэтому не гарантируется)

s = socket(AF_INET, SOCK_STREAM)         # Creates socket
host = 'localhost' # Enter the IP of the workstation here 
port = 80                # Select port which should be pinged

try:
    s.connect((host, port))    # tries to connect to the host
except ConnectionRefusedError: # if failed to connect
    print("Server offline")    # server is offline

s.close()                      # close socket
0

Использование команды os.system ("ping 192.168.178.5") для проверки связи с машиной зависит от системы, в которой вы находитесь.

  • Из онлайн- справки для Ping под windows:

    Успешный PING НЕ всегда возвращает% errorlevel% от 0. Поэтому, чтобы надежно определить успешный пинг, перенаправьте вывод в FIND и ищите текст "TTL".

    Похоже, вам следует использовать вместо ping 192.168.178.5 что-то вроде ping -n 1 192.168.178.5 | find "TTL="

  • От man ping на Linux (Руководство системного менеджера: iputils)

    Если ping вообще не получает ответных пакетов, он завершается с кодом 1. Если указано количество пакетов и крайний срок, и к моменту наступления крайнего срока получено меньше пакетов, чем количество пакетов, он также завершится с кодом 1. При другой ошибке он выходит с кодом 2. В противном случае он выходит с кодом 0. Это позволяет использовать код выхода, чтобы увидеть, жив хост или нет.

    В этом случае вы можете использовать непосредственно код выхода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .