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>
