glennPattonInThePubAgain! Ответов: 1

Ошибка пинга Python3...


Я пытаюсь пинговать адрес с помощью Raspberry PI 3B, попробовал пинговать 192.168.0.1 из командной строки, которая, казалось, отвечала. Теперь мне нужно быстрее приступить к работе, поэтому я попробовал нижеприведенный Python (я далеко не эксперт), чтобы он не работал (сюрприз!) Я попытался заставить его работать, добавив "w", чтобы открыть файл подсчета ошибок, если он не существует, создавая ErrorCount.вход в систему на рабочем столе приводит к тому, что сценарий хромает, а не запускается... Так что же, я создаю текстовый файл неправильно или чахну (или чихаю) неправильно?

Что я уже пробовал:

import socket

max_error_count = 10
error_count = 1


def increase_error_count():
    # Quick hack to handle false Port not open errors
    with open('ErrorCount.log') as f:
        for line in f:
            error_count = line
    error_count = int(error_count)
    print ("Error counter: " + str(error_count))
    file = open('ErrorCount.log', 'w')
    file.write(str(error_count + 1))
    file.close()
    if error_count == max_error_count:
        # Send email, pushover, slack or do any other fancy stuff
        print ("Sending out notification")
        # Reset error counter so it won't flood you with notifications
        file = open('ErrorCount.log', 'w')
        file.write('0')
        file.close()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) 
result = sock.connect_ex(('192.168.0.1',80))
if result == 0:
        print ("Port is open")
else:
        print ("Port is not open")
        increase_error_count()

Richard MacCutchan

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

glennPattonInThePubAgain!

А-а, хорошая мысль... Так что я использую неправильную команду

Jochen Arndt

Я тоже не специалист по Питону.

Вы вообще не пингуете. Вы пытаетесь подключиться к порту 80, который обычно является HTTP-сервером, который терпит неудачу, если такая служба не запущена. Затем вы можете распечатать результирующее значение, чтобы узнать, почему. Если это удастся, вы должны закрыть гнездо.

Если вам нужен реальный (ICMP) пинг, см., например GitHub - samuel/python-ping: чистая версия Python ICMP ping.

glennPattonInThePubAgain!

Я действительно внедренный парень, но иногда мне приходится играть с вещами более высокого уровня
вот тут - то и начинаются неприятности...

Jochen Arndt

Для разработчика приложений сокеты относятся к API самого низкого уровня.

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

1 Ответов

Рейтинг:
6

glennPattonInThePubAgain!

Пройдя дальше по гуглу я нашел вот это

def pingComputer():

  import os
  hostname = input("Enter the ip address: ")
  response = os.system("ping -c 1 " + str(hostname))
  if response == 0:
    print hostname, 'is up!'
  else:
    print hostname, 'is down!

Будет ли это выполнять пинг?
О да, так и будет!!


Richard MacCutchan

Да, конечно, так и будет. Но почему бы просто не ввести команду ping с экрана терминала?

Richard MacCutchan

Интересно, понимаете ли вы это?..
.. приведенный выше код немного напоминает запись телефонного номера на листе бумаги. Затем сложите бумагу четыре или пять раз и положите ее в запечатанный конверт. Затем передал конверт сотруднику и попросил его открыть конверт и прочитать номер. Затем он должен попросить другого сотрудника позвонить по этому номеру, чтобы узнать, отвечает ли кто-нибудь.

В то время как вводить ping непосредственно в командную оболочку - это все равно что самому набирать номер.

glennPattonInThePubAgain!

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