Skip site navigation (1)Skip section navigation (2)
Date:      30 Mar 2001 19:57:17 +0200
From:      Peter Mutsaers <peter@mutsaers.com>
To:        freebsd-stable@freebsd.org
Subject:   Re: Threads vs. blocking sockets
Message-ID:  <87puezb0n6.fsf@mutsaers.com>
In-Reply-To: Brian Matthews's message of "Thu, 29 Mar 2001 12:40:06 -0800"

next in thread | raw e-mail | index | archive | help
>> "Brian" =3D=3D Brian Matthews <blm@actzero.com> writes:

    Brian> | Again, all threading libraries I've used (not just on=20
    Brian> | FreeBSD) *require*
    Brian> | the user to check that when sending/receiving data, the=20
    Brian> | caller must make
    Brian> | sure that all the expected data has been sent/received.

    Brian> Linux doesn't, and I don't think Solaris does (we just
    Brian> moved so I can't try it now, but when I was investigating
    Brian> the problem I'm pretty sure I tried it on our Sun
    Brian> box). Also, it means that threaded Python is basically
    Brian> useless for doing HTTP stuff, as the standard Python
    Brian> library httplib assumes send sends everything or fails
    Brian> (which is how I originally found the problem), and it looks
    Brian> like perl does the same thing.

Any program assuming that send() or write() on a TCP socket writes all
data is broken.

Look in any decent book on socket programming, everywhere you'll find
the standard 'wrapping' of basic send() like:

int n=3Dlength;
while (n>0) {
        n-=3Dsend(sock, msg-length+n, n, flags);
}

This has nothing to do even with threads. It goes for any socket also
in non-threaded environments.

When the tcp-send buffers are full, it will happen. There may be other
causes. I know there used to be many systems that would not send more
than the phisical packet size of the network used (i.e. send's return
value would never be more than 1500 on ethernet, or 4k on token ring).

--=20
Peter Mutsaers  |  D=FCbendorf    | UNIX - Live free or die
plm@gmx.li      |  Switzerland  | Sent via FreeBSD 4.2-stable

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?87puezb0n6.fsf>