2012-08-27 19 views
5

Sto giocando con Python e ascolto i pacchetti UDP su una determinata porta, tutto sembra funzionare correttamente, ma dopo un lungo periodo di tempo lo script si blocca con il seguente errore:Connessione Python ripristinata da peer

Quando si riavvia solo lo script, lo stesso arresto si ripresenta dopo un periodo di tempo più breve. Il riavvio del server sembra invece risolvere il problema completamente per un po 'di tempo.

Per quanto riguarda il lato presa delle cose, che sto facendo:

UDP_IP = "0.0.0.0" 
UDP_PORT = 6000 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind((UDP_IP, UDP_PORT)) 

mi sto perdendo qualcosa di ovvio o c'è solo un modo semplice per evitare questo?

Grazie in anticipo per qualsiasi luce si può perdere!

Benji

risposta

5

L'errore "Connection reset by peer" su un socket UDP, significa che il cliente ha ricevuto un messaggio di errore ICMP (ad esempio: porta irraggiungibile, TTL superato, etc.) dal server su un pacchetto ha inviato.

Non posso dire con certezza che cosa sta causando questo nel codice, ma posso offrire due idee: (problema di routing, insufficienza lato server, ecc)

  1. Il collegamento è stato interrotto da qualcosa di davvero . In questo caso, è possibile verificare questo errore e, se e quando si verifica, è possibile riaprire il socket.
  2. Ciò che sembra più probabile per me, ma con meno familiarità, è che lo SO_REUSEADDR sta causando il problema. Questa opzione di socket consente di aprire più socket sulla stessa porta. Quello che succede probabilmente, è che qualche altro processo sta tentando di usare la porta 6000, succede (perché dici al sistema operativo di non bloccarlo), e il tuo socket è chiuso dal sistema operativo. Poiché non vedo un motivo per utilizzare SO_REUSEADDR su socket UDP, ti suggerisco di rimuovere la riga sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) e riprovare.

Buona fortuna!

Problemi correlati