Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 02 Nov 2007 19:36:20 +0100
From:      Andre Oppermann <andre@freebsd.org>
To:        Ian FREISLICH <ianf@clue.co.za>
Cc:        current@freebsd.org
Subject:   Re: sendfile() not detecting closed connections.
Message-ID:  <472B6E24.20200@freebsd.org>
In-Reply-To: <E1Int69-0000bA-NO@clue.co.za>
References:  <E1Int69-0000bA-NO@clue.co.za>

next in thread | previous in thread | raw e-mail | index | archive | help
Ian FREISLICH wrote:
> Hi
> 
> System is 8.0-CURRENT.  I have the following piece of code:
> 
> 	rename(path, data);
> 	stat(data, &sb);
> 	len = snprintf(buffer, MAXBUFLEN, "BYTES %lld\r\n", sb.st_size);
> 	write(connection, buffer, len);
> 	sleep(10);
> 	if ((sendfile(fd, connection, 0, sb.st_size, NULL,
> 	    &sbytes, 0)) == -1 || sbytes != sb.st_size) {
> 		syslog(facility, "Problem writing data: %s, wrote %lld",
> 		    strerror(errno), sbytes);
> 		respool(fd, path);
> 		unlink(data)
> 		close(fd);
> 		return(-1);
> 	}
> 	else
> 		syslog(facility, "Download successful %ld", sbytes);
> 	close(fd);
> 	unlink(data);
> 
> If, during the sleep, I terminate the connection so that netstat
> reports:
> 
> tcp4       0      0  127.0.0.1.666          127.0.0.1.58239        CLOSE_WAIT
> tcp4       0      0  127.0.0.1.58239        127.0.0.1.666          FIN_WAIT_2
> 
> sendfile() reports success for files less than about 64k in size,
> but I haven't been able to figure out where the threshold is.  It
> erroneously reports that 41000 of the 64k were sent, but will say
> the whole file was transferred up to about 64k.  The connection
> filedescriptor is blocking.
> 
> Any ideas?

sendfile() reports the bytes written into the send socket buffer.  If there
is a connection error it doesn't (and never did) look at how much data was
still in the socket buffer. The sendfile(2) man page says: "[sbytes] If non-NULL,
the system will write the total number of bytes sent on the socket to the variable
pointed to by sbytes."  This could be changed to subtract the remaining data in
the socket buffer before reporting back.  One has to be careful though about
other writes so that the number never goes negative.  There may be more data
remaining in the socket buffer than from this write attempt alone.

-- 
Andre




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?472B6E24.20200>