Сокет Python UDP semi -случайным образом не получает

У меня проблема с чем-то, и я предполагаю, что это код.

Приложение используется для «пингования» некоторых специально созданных сетевых устройств, чтобы проверить, работают ли они. Он пингует их каждые 20 секунд специальным UDP-пакетом и ожидает ответа. Если они не отвечают на 3 последовательных пинга, приложение отправляет предупреждающее сообщение персоналу.

Приложение работает 24/7 и случайное количество раз в день (2 -5 в основном )приложение не получает UDP пакеты точное время 10 минут, после чего все возвращается в норму. В течение этих 10 минут отвечает только одно устройство, остальные кажутся мертвыми. Это я смог сделать вывод из журналов.

Я использовал wireshark для прослушивания пакетов и убедился, что пинг-пакеты отправляются как на вход, так и на вход, поэтому сетевая часть работает нормально, вплоть до ОС. Компьютеры работают под управлением WinXPPro, а на некоторых вообще не настроен брандмауэр. У меня эта проблема на разных компьютерах, в разных установках Windows и в разных сетях.

Я действительно в недоумении, в чем может быть проблема.

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

Я заранее благодарю вас за любую информацию, которую вы могли бы дать.

def monitor(self):
    checkTimer = time()
    while self.running:
        read, write, error = select.select([self.commSocket],[self.commSocket],[],0)
        if self.commSocket in read:
            try:
                data, addr = self.commSocket.recvfrom(1024)
                self.processInput(data, addr)
            except:
                pass

        if time() - checkTimer > 20: # every 20 seconds
            checkTimer = time()
            if self.commSocket in write:
                for rtc in self.rtcList:
                    try:
                        addr = (rtc, 7) # port 7 is the echo port
                        self.commSocket.sendto('ping',addr)
                        if not self.rtcCheckins[rtc][0]: # if last check was a failure
                            self.rtcCheckins[rtc][1] += 1 # incr failure count
                        self.rtcCheckins[rtc][0] = False # setting last check to failure
                    except:
                        pass

        for rtc in self.rtcList:
            if self.rtcCheckins[rtc][1] > 2: # didn't answer for a whole minute
                self.rtcCheckins[rtc][1] = 0
                self.sendError(rtc)
6
задан flowInTheDark 18 July 2012 в 07:55
поделиться