2013-02-13 14 views
9

Ho un'architettura server client scritta in python. La maggior parte delle volte funziona, ma a volte, dopo aver arrestato il server e riavviato subito dopo, viene visualizzato il seguente errore:Eccezione argomento non valido in socket.accept() se si riavvia immediatamente dopo l'esecuzione di una sessione precedente

Accettato non riuscito a causa di: 22 Messaggio Argomento non valido, errore: [Errno 22] non valido argomento

Tuttavia, se attendo qualche minuto e riavvio lo stesso script senza modifiche, funziona correttamente.

Questo è il ciclo che uso sul server di accettare connessioni in entrata da parte dei clienti:

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind(('',port)) 
    s.listen(1) 
except: 
    #logError() 

while True: 
    try: 
     conn, address = s.accept() #THIS ACCEPT FAILS SOMETIMES 
     multiprocessing.Process(target=HandleConnection, args=(conn, address, messageQueue, taskQueue, IOLock, numberOfConnections, numberOfConnectionsLock,resultsDirectory)).start() 
    except socket.error, msg: 
     #logError() -> this except catches the error 

Condivide la porta si blocchi per qualche tempo dopo ho eseguito il server? Se è così, c'è modo di interrogare se la porta è bloccata e aspettare finché non viene sbloccata se voglio riavviare il server immediatamente dopo che è appena uscito?

risposta

7

È necessario impostare SO_REUSEADDR prima di impegnare.

setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

In caso contrario si può impedire la presa di legarsi, quindi l'errore quando accept ing. Avresti notato questo errore se non avessi sospeso le eccezioni nel primo blocco.

+0

Non stavo bloccando l'eccezione, stavo registrando, ma credo che avrei dovuto tornare dopo. Invece sono entrato nel ciclo while, che ha riempito i miei log di rifiuti e ho pensato che ci fosse un problema con accept e non con bind. Frustrante. – Alexander

+0

@Alexander Oh capisco. Scusate se il mio commento suonava snarky, è del tutto comprensibile perdere un avvertimento con così tanti altri. – cnicutar

+0

Sì, immagino di essere stato svalutato e ho pensato "omg, non sto cercando di fare una domanda stupida, sono stato a questo per ore e ore". Grazie mille per il vostro aiuto. – Alexander

Problemi correlati