Subject: Re: tcp RST instead of FIN if child exits after parent closes path
From: "Max Bowsher" <[email-masked]>
To: "Brian White" <[email-masked]>
Cc: <[email-masked]>
Date: Tue, 15 Apr 2003 23:39:29 +0100

Brian White wrote:
>>>> This is a bug/feature of Windows Sockets. I think it would be possible
to
>>>> craft a workaround in Cygwin, but it would require some non-trivial
IPC.
>>>> (IIUC, you would need to maintain a cross-process refcount for the
socket).
>>>
>>> Hmmm...  From my work with Amanda, the child process can continue to
>>> send data via the socket even after the parent has closed it's handle
>>> on that path, so there must be some sort of reference counting already.
>>
>> Yes, but the wrong sort.
>>
>> To guarantee avoiding the RST, you need to shutdown(SHUT_WR) the socket.
And
>> that does stop all processes from writing to the socket. So, you would
need
>> to refcount the socket, and issue a shutdown just before the last close.
(I
>> think.)
>
> I don't follow.  The path is still open and able to send the data from the
> child even though the parent has closed it.  It's only when the child
exits
> (note: the child just exited; it didn't do an explicit "close") that the
> connection was killed, so there the system already knows when the last
close
> occurs.  What is being done to the socket that is different depending upon
> whether the final close comes from the process that originally opened it
or
> another one?

I believe it is not which process does the final close that matters. Rather,
I think that it is write-then-immediately-close that causes the RST. (At
least with some socket options).

For detail, see MSDN. Look up the closesocket() function, and read that
page, and also "Graceful Shutdown, Linger Options, and Socket Closure"
linked to from that page.

Max.

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/