Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 Mar 2001 14:08:40 -0600
From:      "Jim King" <jim@jimking.net>
To:        "Nate Williams" <nate@yogotech.com>
Cc:        "Paul Marquis" <pmarquis@pobox.com>, "Nate Williams" <nate@yogotech.com>, "Brian Matthews" <blm@actzero.com>, "Allen Landsidel" <all@biosys.net>, <freebsd-stable@FreeBSD.ORG>
Subject:   Re: Threads vs. blocking sockets
Message-ID:  <011001c0b88c$1009bde0$524c8486@jking>
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
OK, that makes sense to me - thanks for the clue. :-)

Jim

"Nate Williams" <nate@yogotech.com> 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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?011001c0b88c$1009bde0$524c8486>