[Python-Dev] socket._socketobject.close() doesn't really close sockets

Bruce Christensen t-bruch at microsoft.com
Tue Jun 13 01:47:02 CEST 2006


In implementing the IronPython _socket module, I've discovered some
puzzling behavior in the standard Python socket wrapper module:
socket._socketobject.close() doesn't actually close sockets; rather, it
just sets _sock to an instance of _closedsocket and lets the GC clean up
the real socket. (See socket.py around line 160.)

This works fine with a reference counting GC, but can potentially leave
sockets hanging around for a long time on platforms (e.g. the CLR) with
other GC algorithms. It causes most of the socket unit tests to fail on
IronPython.

Is there a reason for this implementation?

This patch to _socketobject.close() makes socket.py work with
IronPython:

     def close(self):
+        if not isinstance(self._sock, _closedsocket):
+            self._sock.close()
         self._sock = _closedsocket()
         self.send = self.recv = self.sendto = self.recvfrom =
self._sock._dummy

--Bruce


More information about the Python-Dev mailing list