Non-blocking connect

Roy Smith roy at panix.com
Fri May 2 14:38:47 EDT 2008


In article 
<1029ba0a-74e0-41d3-8397-7e326f4611bf at a9g2000prl.googlegroups.com>,
 mp <mailpitches at email.com> wrote:

> Thanks Roy. I was just trying to understand someone else's code, but
> in the end it turns out that this was just a bug.
> 
> What weirded me out was how injecting a print statement preventing the
> error from occurring, but now I get it. Without blocking, the
> connection handshake occurs in parallel after the connect_exc method
> is called. In my example, my processor reaches the send call before
> the connection manages to complete in the background. However, if you
> stick in a print statement after the connect_exc call and before the
> send call, it delays processing just long enough for the connection to
> complete, thus no exception is thrown by the send call.

I don't really understand that last part.  There shouldn't be any 
background processing going on, unless there's a lot more code than you 
showed.

The three-way handshake *can't* happen in the background, because 
connect_ex() has no way to know what value to return until the handshake is 
completed.  Let's say I send a SYN, and 15 seconds later, you send a RST 
(indicating that the connection has been refused).  The connect_ex() call 
has to have waited the 15 seconds for this to happen so it knows to return 
an appropriate error code.

I do not understand why sticking a print statement in there should make any 
difference.



More information about the Python-list mailing list