From owner-freebsd-stable Thu Mar 29 12: 0:26 2001 Delivered-To: freebsd-stable@freebsd.org Received: from ns.yogotech.com (ns.yogotech.com [206.127.123.66]) by hub.freebsd.org (Postfix) with ESMTP id 92ACF37B71F for ; Thu, 29 Mar 2001 12:00:20 -0800 (PST) (envelope-from nate@yogotech.com) Received: from nomad.yogotech.com (nomad.yogotech.com [206.127.123.131]) by ns.yogotech.com (8.9.3/8.9.3) with ESMTP id NAA08125; Thu, 29 Mar 2001 13:00:03 -0700 (MST) (envelope-from nate@nomad.yogotech.com) Received: (from nate@localhost) by nomad.yogotech.com (8.8.8/8.8.8) id MAA12911; Thu, 29 Mar 2001 12:59:59 -0700 (MST) (envelope-from nate) From: Nate Williams MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15043.37950.941991.251263@nomad.yogotech.com> Date: Thu, 29 Mar 2001 12:59:58 -0700 (MST) To: "Jim King" Cc: "Paul Marquis" , "Nate Williams" , "Brian Matthews" , "Allen Landsidel" , Subject: Re: Threads vs. blocking sockets In-Reply-To: <00f201c0b889$c4ff4d30$524c8486@jking> References: <15043.35980.669828.971544@nomad.yogotech.com> <00dd01c0b886$d8510250$524c8486@jking> <3AC390FD.6C03BF8F@pobox.com> <00f201c0b889$c4ff4d30$524c8486@jking> X-Mailer: VM 6.75 under 21.1 (patch 12) "Channel Islands" XEmacs Lucid Reply-To: nate@yogotech.com (Nate Williams) Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG > 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