2010-02-16 8 views
14

Se il mio programma si arresta in modo anomalo prima che un socket venga chiuso, la volta successiva che eseguo, viene visualizzato un errore simile a questo;Impossibile eseguire il binding all'indirizzo dopo il blocco del programma socket

socket.error: [Errno 48] Address already in use 

La modifica della porta risolve il problema.

C'è un modo per evitarlo, e perché questo accade (quando il programma termina, il socket non dovrebbe essere gettato nella spazzatura e chiuso)?

+1

Se avessi eseguito 'netstat -an', avresti visto che la tua porta di ascolto esisteva ancora nello stato' TIME_WAIT'. Solo un consiglio, spero che aiuti in futuro. – ephemient

+1

Grazie per il suggerimento, daremo un'occhiata alla prossima volta. –

risposta

23

Utilizzare .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sulla presa di ascolto.

Una ricerca per questi termini vi darà molte spiegazioni sul motivo per cui è necessario. In sostanza, dopo aver chiuso il primo programma, il sistema operativo mantiene il socket di ascolto precedente in uno stato di arresto per il tempo TIME_WAIT. SO_REUSEADDR dice che si desidera utilizzare la stessa porta di ascolto indipendentemente.

3

La maggior parte dei SO richiede fino a minuti per chiudere il socket quando il programma non lo chiude correttamente prima. Ho colpito molte volte con i programmi C SEGFAULT (e io non ce l'ho gestito) o simili.

Modifica:
Grazie a ephemient per indicare RFC 793 (TCP) che definisce questo timeout.

+2

RFC 793 (TCP) dice che 'TIME_WAIT' dovrebbe essere 2MSL, che per impostazione predefinita è di 2 minuti, a meno che non vengano ricevuti ulteriori pacchetti FIN. 5 minuti sarebbero insolitamente lunghi. – ephemient

2

Altre persone che ottengono questo errore potrebbero ottenerlo perché la porta è in uso da un altro processo. Quindi controlla se la porta viene utilizzata da altri processi e esegui il tuo programma in un'altra porta o uccidi i processi di blocco.

Problemi correlati