2009-03-03 10 views
6

Ho recentemente imparato Python e ho appena iniziato a giocare con il networking usando la libreria socket di python. Tutto sta andando bene fino a poco tempo fa, quando il mio script è terminato senza chiudere la connessione. La prossima volta che mi sono imbattuto la sceneggiatura, ho ottenuto:Collegamento porta Python

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

Così sembra che qualcosa è ancora binded alla porta, anche se lo script python non è in esecuzione (e ho verificato questo utilizzando $px aux Cosa c'è. è strano che dopo un minuto o giù di lì, riesco a eseguire nuovamente lo script sulla stessa porta e andrà tutto bene. C'è un modo per impedire/svincolare una porta per quando questo accade in futuro?

risposta

14

Cosa vuoi da fare è appena prima del bind, fare:

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

La ragione per cui si sta osservando il comportamento che si è è che il sistema operativo riserva quella particolare porta per qualche tempo dopo l'interruzione dell'ultima connessione. In questo modo è possibile scartare correttamente eventuali ulteriori pacchetti che potrebbero entrare dopo la chiusura dell'applicazione.

Impostando l'opzione socket SO_REUSEADDR, stai dicendo al sistema operativo che sai cosa stai facendo e vuoi ancora collegarlo alla stessa porta.

+1

Inoltre, è possibile chiamare shutdown() e close() sul socket. –

Problemi correlati