Reputation: 7812
I've recently been learning python and I just started playing with networking using python's socket
library. Everything has been going well until recently when my script terminated without closing the connection. The next time I ran the script, I got:
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')
So it seems that something is still binded to the port, even though the python script isn't running (and I've verified this using $px aux
. What's weird is that after a minute or so, I can run the script again on the same port and it will be fine. Is there any way to prevent/unbind a port for when this happens in the future?
Upvotes: 7
Views: 3981
Reputation: 992707
What you want to do is just before the bind
, do:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
The reason you are seeing the behaviour you are is that the OS is reserving that particular port for some time after the last connection terminated. This is so that it can properly discard any stray further packets that might come in after the application has terminated.
By setting the SO_REUSEADDR
socket option, you are telling the OS that you know what you're doing and you still want to bind to the same port.
Upvotes: 17