Atsuo Ishimoto wrote:

...
class Client(basic.LineReceiver):
    def connectionMade(self):
        class dmyfile:
            def read(self, n):
                if CANCELED:
                    return
                else:
                    return '1'

        s = basic.FileSender()
        print "start sending"

        def f1(lastChunk):
            print "finished"

...
def cancel():
    print "cancel", conn.state
    global CANCELED
    CANCELED = True
    conn.disconnect()

I think the problem is that you call conn.disconnect before the FileSender has a chance to call unregisterProducer on the transport (in real life before it has sent the whole file). If the producer is not unregistered, the doWrite() method called from the reactor doesn't even check if the connection is in 'disconnecting' state, assumes there's more data to come, and since no further events occur on the channel, the connection just remains open. You can check that by manually writing one more byte to the transport in f1, after FileSender has unregistered itself. The correct way is to call conn.disconnect()/transport.loseConnection() in f1 instead of in cancel.

from t.i.abstract.FileDescriptor.loseConnection.__doc__:
"... If you have a producer registered, the connection won't be closed until the producer is finished. Therefore, make sure you unregister your producer when it's finished, or the connection willnever close ..."

hth, Johann
reactor.callLater(2, cancel) # disconnect 2 sec later
reactor.run()

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python



_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to