sendfile() not detecting closed connections.
Ian FREISLICH
ianf at clue.co.za
Sun Nov 4 21:01:23 PST 2007
Andre Oppermann wrote:
> 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_WA
IT
> > 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.
The connection was closed about 6 seconds before I called sendfile().
Would sendfile() write to the socket buffer of a socket closed that
long ago?
Ian
--
Ian Freislich
More information about the freebsd-current
mailing list