Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Mar 2001 12:13:15 -0800
From:      Mike Ruhl <mruhl@network-alchemy.com>
To:        Jim King <jim@jimking.net>
Cc:        Nate Williams <nate@yogotech.com>, Paul Marquis <pmarquis@pobox.com>, Brian Matthews <blm@actzero.com>, Allen Landsidel <all@biosys.net>, freebsd-stable@FreeBSD.ORG
Subject:   Re: Threads vs. blocking sockets
Message-ID:  <3AC3975B.C2F624AF@network-alchemy.com>
References:  <F0D64494733BD411BB9A00D0B74A0264021C9E@cpe-24-221-167-196.ca.sprintbbd.net> <15043.35980.669828.971544@nomad.yogotech.com> <00dd01c0b886$d8510250$524c8486@jking> <3AC390FD.6C03BF8F@pobox.com> <00f201c0b889$c4ff4d30$524c8486@jking> <15043.37950.941991.251263@nomad.yogotech.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------9F0D9F61BA9412F5C0A087B4
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Just two other comments on this topic...

Note: a send of 0 (zero) bytes is just as valid as a send of > 0
bytes.

Also, depending on how the socket was created, send(2) will behave
differently.

s = socket(domain, SOCK_STREAM, 0);

Does completly different things than:

s = socket(domain, SOCK_DGRAM, 0);

When doing send()s on sockets, make sure you understand the underlying
protocol before you decide that something works or does not work.

Mike

Nate Williams wrote:
> 
> > None of the documented values for errno as set by send(2) indicate "only
> > part of the data was sent", at least by my reading.
> 
> That's because it's not an error to send part of the data.
> 
> > How do I tell how many bytes were sent?
> 
> The call returns the number of characters (bytes) sent.  You do know how
> much data you were sending, don't you?
> 
> Here's a clue for you, since you apparently aren't getting one
> otherwise.  This code probably won't even compile due to const
> poisoning, but hopefully you'll get the idea.
> 
> boolean
> mySocketSend(int s, const void *msg, size_t len, int flags)
> {
>     size_t totalSent;
>     void *data;
> 
>     totalSent = 0;
>     data = msg;
>     do
>     {
>         size_t sent;
>         sent = send(s, data, len - sentBytes, flags);
>         if (sent < 0)
>         {
>             /* XXX - Handle the error here */
>             return false;
>         }
>         else if (sent > 0)
>         {
>             totalSent += sent;
>             data += sent;
>         }
>     } while (totalSent < len);
> 
>     /* Success, sent all the bytes */
>     return true;
> }
> 
> >
> > Still sounds broken to me.
> >
> > Jim
> >
> > "Paul Marquis" <pmarquis@pobox.com> wrote:
> >
> > > Under the manual entry for send(2), the RETURN VALUES section states:
> > >
> > >   The call returns the number of characters sent, or -1 if an
> > >   error occured.
> > >
> > > So if you request to send 100 bytes, the OS may only be able to sent
> > > half those and you need to check how many you sent an resend the part
> > > that wasn't sent.
> > >
> > > Nate is right.
> > >
> > > Jim King wrote:
> > > > Nate Williams wrote:
> > > > > Again, all threading libraries I've used (not just on FreeBSD)
> > *require*
> > > > > the user to check that when sending/receiving data, the caller must
> > make
> > > > > sure that all the expected data has been sent/received.
> > > >
> > > > The man page for send(2) doesn't mention this.  It sounds broken to me.
> >
> >
> 
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-stable" in the body of the message
--------------9F0D9F61BA9412F5C0A087B4
Content-Type: text/x-vcard; charset=us-ascii;
 name="mruhl.vcf"
Content-Transfer-Encoding: 7bit
Content-Description: Card for Mike Ruhl
Content-Disposition: attachment;
 filename="mruhl.vcf"

begin:vcard 
n:Ruhl;Michael J
tel;work:(831) 440-6472
x-mozilla-html:FALSE
org:Nokia
adr:;;1538 Pacific Avenue;Santa Cruz;CA.;95060;U.S.A.
version:2.1
email;internet:mruhl@cips.nokia.com
title:Tall Blond Guy
x-mozilla-cpt:;0
fn:Michael J Ruhl
end:vcard

--------------9F0D9F61BA9412F5C0A087B4--


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?3AC3975B.C2F624AF>