Tengo un problema con algo y supongo que es el código.Socket de Python UDP que falla al recibir semi-aleatoriamente
La aplicación se utiliza para 'hacer ping' en algunos dispositivos de red personalizados para comprobar si están activos. Los lanza cada 20 segundos con un paquete UDP especial y espera una respuesta. Si no responden 3 veces consecutivas, la aplicación envía un mensaje de advertencia al personal.
La aplicación se ejecuta 24/7 y durante un número aleatorio de veces al día (2-5 en su mayoría) la aplicación no puede recibir paquetes UDP durante un tiempo exacto de 10 minutos, después de lo cual todo vuelve a la normalidad. Durante esos 10 minutos, solo 1 dispositivo parece estar respondiendo, otros parecen muertos. Que he podido deducir de los registros.
He utilizado wireshark para olfatear los paquetes y he verificado que los paquetes de ping salen Y entran, por lo que la parte de la red parece funcionar bien, todo el camino hasta el sistema operativo. Las computadoras están ejecutando WinXPPro y algunas no tienen ningún firewall configurado. Estoy teniendo este problema en diferentes computadoras, diferentes instalaciones de Windows y diferentes redes.
Estoy realmente perdido sobre cuál podría ser el problema aquí.
Estoy adjuntando la parte relevante del código que hace toda la red. Esto se ejecuta en un hilo separado del resto de la aplicación.
Le agradezco de antemano cualquier información que pueda proporcionar.
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)
no olvide que UDP no garantiza la transmisión confiable: http://en.wikipedia.org/wiki/ User_Datagram_Protocol –
Estoy enterado de eso, pero el sistema heredado aquí está usando UDP bastante confiablemente durante 15 años más o menos y el resto del sistema no tiene tales problemas. – flowInTheDark