2009-03-03 6 views
6

J'ai récemment commencé à apprendre Python et je viens de commencer à jouer en réseau en utilisant la bibliothèque socket de python. Tout s'est bien passé jusqu'à récemment lorsque mon script s'est terminé sans fermer la connexion. La prochaine fois que je courais le script, je me suis:Liaison de port 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') 

Il semble donc que quelque chose est encore binded au port, même si le script python ne fonctionne pas (et je l'ai vérifié cela en utilisant $px aux Qu'est-ce. bizarre est que, après une minute ou deux, je peux réexécuter le script sur le même port et il ira bien.Y at-il un moyen d'empêcher/délier un port pour quand cela arrive dans le futur?

Répondre

14

Qu'est-ce que vous voulez à faire est juste avant le bind, faire:

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

La raison pour laquelle vous voyez votre comportement est que le système d'exploitation réserve ce port particulier pendant un certain temps après la fin de la dernière connexion. Cela permet de supprimer correctement tous les autres paquets parasites qui pourraient arriver après la fin de l'application. En définissant l'option de socket SO_REUSEADDR, vous indiquez au système d'exploitation que vous savez ce que vous faites et que vous souhaitez toujours lier le même port.

+1

Vous pouvez également appeler shutdown() et close() sur le socket. –