Tu Hoang Tu Hoang - 4 months ago 11
Python Question

Python: Binding Socket: "Address already in use"

I have a question regarding client socket on TCP/IP network. Let's say I use

try:

comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

except socket.error, msg:

sys.stderr.write("[ERROR] %s\n" % msg[1])
sys.exit(1)

try:
comSocket.bind(('', 5555))

comSocket.connect()

except socket.error, msg:

sys.stderr.write("[ERROR] %s\n" % msg[1])

sys.exit(2)


The socket created will be bound to port 5555. The problem is that after ending the connection

comSocket.shutdown(1)
comSocket.close()


Using wireshark, I see the socket closed with FIN,ACK and ACK from both sides, I can't use the port again. I get the following error:

[ERROR] Address already in use


I wonder how can I clear the port right away so that next time I still can use that same port.

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


setsockopt doesn't seem to be able to resolve the problem
Thank you!

Answer

Try using the SO_REUSEADDR socket option before binding the socket.

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

Edit: I see you're still having trouble with this. There is a case where SO_REUSEADDR won't work. If you try to bind a socket and reconnect to the same destination (with SO_REUSEADDR enabled), then TIME_WAIT will still be in effect. It will however allow you to connect to a different host:port.

A couple of solutions come to mind. You can either continue retrying until you can gain a connection again. Or if the client initiates the closing of the socket (not the server), then it should magically work.

Comments