Re: Closing non-blocking network sockets

From: Stewart Forster <slf@dont-contact.us>
Date: Thu, 14 May 1998 08:41:35 +1000

--MimeMultipartBoundary
Content-Type: text/plain; charset=us-ascii

> What about SO_LINGER? Some sockets will have the default value for
> SO_LINGER, some will have it forced off.
>
> What happens if a non-blocking socket has SO_LINGER turned on? Does the
> close fail completely, or is the socket queued for a automated close
> after the linger period (most likely)?

        Hmm. There's actually conflicting reports in the manual pages.
>From Solaris 2.1

man -s2 close

     If a STREAMS-based (see intro(2)) fildes is closed, and the
     calling process had previously registered to receive a SIG-
     POLL signal (see signal(3C)) for events associated with that
     stream (see I_SETSIG in streamio(7I)), the calling process
     will be unregistered for events associated with the stream.
     The last close() for a stream causes the stream associated
     with fildes to be dismantled. If O_NDELAY and O_NONBLOCK
     are clear and there have been no signals posted for the
     stream, and if there are data on the module's write queue,
     close() waits up to 15 seconds (for each module and driver)
     for any output to drain before dismantling the stream. The
     time delay can be changed using an I_SETCLTIME ioctl request
     (see streamio(7I)). If O_NDELAY or O_NONBLOCK is set, or if
     there are any pending signals, close() does not wait for
     output to drain, and dismantles the stream immediately.

man -s3n setsockopt

     SO_LINGER controls the action taken when unsent messages are
     queued on a socket and a close(2) is performed. If the
     socket promises reliable delivery of data and SO_LINGER is
     set, the system will block the process on the close()
     attempt until it is able to transmit the data or until it
     decides it is unable to deliver the information (a timeout
     period, termed the linger interval, is specified in the
     setsockopt() call when SO_LINGER is requested). If
     SO_LINGER is disabled and a close() is issued, the system
     will process the close() in a manner that allows the process
     to continue as quickly as possible.

        Sockets in Solaris use streams as the communication medium. On
one hand we have a close() on a socket set with O_NONBLOCK closing
immediately, and close() on a socket with SO_LINGER set not doing so,
and neither make a reference as to which takes precedence.

        Short of testing, which is somewhat hard to measure and do, I'll
put out another patch which tests for SO_LINGER as well, and if that's
set, then do an aioClose for that condition too.

> Either way we lose track of a used FD until it is fully shut down.

        We could always put a callback in on the aioClose() and get it
to set the FD as free once the close completes...

        Cheers,

                Stew.

-- 
Stewart Forster (Snr. Development Engineer)
connect.com.au pty ltd, Level 9, 114 Albert Rd, Sth Melbourne, VIC 3205, Aust.
Email: slf@connect.com.au   Phone: +61 3 9251-3684   Fax: +61 3 9251-3666
--MimeMultipartBoundary--
Received on Tue Jul 29 2003 - 13:15:49 MDT

This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:11:47 MST