This is an old patch, it wasn't applied because not all transport backends support disconnecting but since I assume most people uses the basic int32/16 protocols on top of tcp this isn't a pratical concern for me, and I prefer no data callback to fire after calling loseConnection. This isn't an high prio patch but I post it anyway (I understand if it will not be applied to SVN again for the valid reason that disconnecting may not exists, I admit I never investigated since I only use tcp and udp, my argument that disconnecting could be added in a compatible transparent way to all transports still holds). diff -r 493b5c24e0f3 twisted/protocols/basic.py --- a/twisted/protocols/basic.py Tue May 16 04:57:00 2006 +0000 +++ b/twisted/protocols/basic.py Wed May 17 15:59:28 2006 +0200 @@ -309,7 +309,7 @@ class Int32StringReceiver(protocol.Proto """Convert int32 prefixed strings into calls to stringReceived. """ self.recvd = self.recvd + recd - while len(self.recvd) > 3 and not self.paused: + while len(self.recvd) > 3 and not self.paused and not self.transport.disconnecting: length ,= struct.unpack("!i",self.recvd[:4]) if length > self.MAX_LENGTH: self.transport.loseConnection() @@ -346,7 +346,7 @@ class Int16StringReceiver(protocol.Proto """Convert int16 prefixed strings into calls to stringReceived. """ self.recvd = self.recvd + recd - while len(self.recvd) > 1 and not self.paused: + while len(self.recvd) > 1 and not self.paused and not self.transport.disconnecting: length = (ord(self.recvd[0]) * 256) + ord(self.recvd[1]) if len(self.recvd) < length+2: break