У меня проблема с чем-то, и я предполагаю, что это код.
Приложение используется для «пингования» некоторых специально созданных сетевых устройств, чтобы проверить, работают ли они. Он пингует их каждые 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)