From owner-freebsd-stable Thu Mar 29 12: 9: 3 2001 Delivered-To: freebsd-stable@freebsd.org Received: from flounder.jimking.net (flounder.jimking.net [209.205.176.18]) by hub.freebsd.org (Postfix) with ESMTP id 891E937B719 for ; Thu, 29 Mar 2001 12:08:56 -0800 (PST) (envelope-from jim@jimking.net) Received: from jking (jking.lgc.com [134.132.76.82]) (authenticated) by flounder.jimking.net (8.11.2/8.11.2) with ESMTP id f2TK8fO67576 (using TLSv1/SSLv3 with cipher RC4-MD5 (128 bits) verified NO); Thu, 29 Mar 2001 14:08:46 -0600 (CST) (envelope-from jim@jimking.net) Message-ID: <011001c0b88c$1009bde0$524c8486@jking> From: "Jim King" To: "Nate Williams" Cc: "Paul Marquis" , "Nate Williams" , "Brian Matthews" , "Allen Landsidel" , References: <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> Subject: Re: Threads vs. blocking sockets Date: Thu, 29 Mar 2001 14:08:40 -0600 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG OK, that makes sense to me - thanks for the clue. :-) Jim "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" 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