Thanks Andrew!

Andrew Bennetts 写道:
Lian Cheng wrote:
Hi, all

As a Twisted newbie, I read the Twisted documentation, and found that:

  1. ITransport.write() doesn't return a deferred.
  2. IProtocol doesn't have a dataSent() callback or something alike.

Since ITransport.write() is a non-blocking call, how can I be informed when data sent by ITransport.write() is actually sent successfully?

It depends on what exactly you mean by "successfully".  Just because Twisted
has delivered the bytes to the OS for delivery (e.g. via the send(2)
syscall) doesn't mean they'll actually arrive at your intended destination.

So,

If you want to know if the bytes have arrived, get the remote side to send
back an explicit ACK of some sort.

I was actually confused by the words written in the documentation:

If possible, make sure that it is all written. No data will ever be lost, although (obviously) the connection may be closed before it all gets through.

Seems here the documentation means that the connection may be closed due to some fatal errors such as network cable unplugged rather than calling ITransport.loseConnection().


If you want to know when the send buffer[1] isn't full anymore, so that you
can start working to fill it again, implement a pull producer
<http://twistedmatrix.com/projects/core/documentation/howto/producers.html#auto4>
and call the transport's registerProducer method with it.

Seems like what I'm looking for :-)


If you want something else, reply and tell us what :)

Thanks a lot again :-)


-Andrew.

[1] “send buffer” is fairly loose terminology, but it'll do.

Lian Cheng wrote:
Hi, all

As a Twisted newbie, I read the Twisted documentation, and found that:

  1. ITransport.write() doesn't return a deferred.
  2. IProtocol doesn't have a dataSent() callback or something alike.

Since ITransport.write() is a non-blocking call, how can I be informed when data sent by ITransport.write() is actually sent successfully?

It depends on what exactly you mean by "successfully".  Just because Twisted
has delivered the bytes to the OS for delivery (e.g. via the send(2)
syscall) doesn't mean they'll actually arrive at your intended destination.

So,

If you want to know if the bytes have arrived, get the remote side to send
back an explicit ACK of some sort.

If you want to know when the send buffer[1] isn't full anymore, so that you
can start working to fill it again, implement a pull producer
<http://twistedmatrix.com/projects/core/documentation/howto/producers.html#auto4>
and call the transport's registerProducer method with it.

If you want something else, reply and tell us what :)

-Andrew.

[1] “send buffer” is fairly loose terminology, but it'll do.


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

Reply via email to