From owner-freebsd-hackers@FreeBSD.ORG Thu Apr 24 18:21:28 2003 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0BD8337B401 for ; Thu, 24 Apr 2003 18:21:28 -0700 (PDT) Received: from foem.leiden.webweaving.org (fia224-72.dsl.hccnet.nl [62.251.72.224]) by mx1.FreeBSD.org (Postfix) with ESMTP id 4E6FC43F85 for ; Thu, 24 Apr 2003 18:21:20 -0700 (PDT) (envelope-from dirkx@webweaving.org) Received: from foem (foem [10.11.0.2])h3P1LIkF027570 for ; Fri, 25 Apr 2003 03:21:18 +0200 (CEST) (envelope-from dirkx@webweaving.org) Date: Fri, 25 Apr 2003 03:21:18 +0200 (CEST) From: Dirk-Willem van Gulik X-X-Sender: dirkx@foem.leiden.webweaving.org To: freebsd-hackers@freebsd.org Message-ID: <20030425031450.G8323-100000@foem.leiden.webweaving.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: recv() returning 0 and EINTR on a still connection. X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Apr 2003 01:21:28 -0000 After an upgrade from 2.2.8 to 5.0 the following fragement of code in userland seems to trip under high loads: server-code n = recv(... if (n<0) { if (errno = EAGAIN) .. if (errno = EINTR) .. } if (n == 0) bing with a n == 0 and errno == EINTR. (i.e. NOT n=-1). Even though the connection does not seem closed from the client end. Is it possible for n==0 -not- to mean that the connection is closed ? Or in other words that recv() behaves not like read(2) in this respect. (In all fairness; the man page for recv(2) does only detail n=-1 for the EAGAIN. And does not mention any semantics for n==0, unlike read(2) which says: RETURN VALUES If successful, the number of bytes actually read is returned. Upon read- ing end-of-file, zero is returned. Otherwise, a -1 is returned and the global variable errno is set to indicate the error. Is recv() fundamentally different ? And is n==0 errno=EINTR a possible valid return with the meaning; interupted and no bytes read ? Thanks Dw