Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to close a socket left open by a killed program?

I have a Python application which opens a simple TCP socket to communicate with another Python application on a separate host. Sometimes the program will either error or I will directly kill it, and in either case the socket may be left open for some unknown time.

The next time I go to run the program I get this error:

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

Now the program always tries to use the same port, so it appears as though it is still open. I checked and am quite sure the program isn't running in the background and yet my address is still in use.

SO, how can I manually (or otherwise) close a socket/address so that my program can immediately re-use it?

Update

Based on Mike's answer I checked out the socket(7) page and looked at SO_REUSEADDR:

SO_REUSEADDR     Indicates that the rules used in validating addresses supplied in a bind(2) call should     allow reuse of local addresses.  For AF_INET sockets this means that a socket may bind,     except when there is an active listening socket bound to the address.  When the listen‐     ing  socket is bound to INADDR_ANY with a specific port then it is not possible to bind     to this port for any local address.  Argument is an integer boolean flag. 
like image 584
Mr. Shickadance Avatar asked May 03 '11 14:05

Mr. Shickadance


People also ask

What happens if socket is not closed?

One way or another, if you don't close a socket, your program will leak a file descriptor. Programs can usually only open a limited number of file descriptors, so if this happens a lot, it may turn into a problem.

How do you close a socket connection in Python?

close() is indeed the correct way to close the connection.


2 Answers

Assume your socket is named s... you need to set socket.SO_REUSEADDR on the server's socket before binding to an interface... this will allow you to immediately restart a TCP server...

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((ADDR, PORT)) 
like image 190
Mike Pennington Avatar answered Sep 18 '22 18:09

Mike Pennington


You might want to try using Twisted for your networking. Mike gave the correct low-level answer, SO_REUSEADDR, but he didn't mention that this isn't a very good option to set on Windows. This is the sort of thing that Twisted takes care of for you automatically. There are many, many other examples of this kind of boring low-level detail that you have to pay attention to when using the socket module directly but which you can forget about if you use a higher level library like Twisted.

like image 43
Jean-Paul Calderone Avatar answered Sep 17 '22 18:09

Jean-Paul Calderone