Make sure there's no unread rx data from the client waiting in the server's receive queue when you close the socket. If there is then Linux will immediately discard any unsent tx data and send a RST to the client, regardless of SO_LINGER. Other os'es (e.g. Solaris) go ahead and send the rest of the tx data and do an orderly close in that event but Linux does not.
One way to make sure that doesn't happen is by doing shutdown(SHUT_WR), then reading from the fd until the client closes, then closing. Or you can simply design the client and server to avoid it if you have control over both of them.
Jim
Stephen Samuel wrote:
Rather than using close, try calling shutdown (2)... (dunno if it will work).
If that doesn't work, then use the socket option SO_LINGER
SO_LINGER When enabled, a close(2) or shutdown(2) will not return until all queued messages for the socket have been successfully sent or the linger timeout has been reached. Otherwise, the call returns immediately and the closing is done in the background.
man 7 socket for more info
Lee Chin wrote:
Hi,
I am trying to send 500K on a asynchronous socket and after I've written all my data, I want to close the socket.
So I send data in a loop, and between calls to "write" I select on the filedescriptor till it is writable again and send more data.
I continue this untill I have no more data to send.
At the end, after sending all my data, I "close" the socket.
However, the client sees a TCP RST packet and only receives partial data.
What am I doing wrong? I though that the close would actually kill the socket after all the data has been sent
Thanks Lee
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature