I believe that if we call close system call on a non-blocking socket it returns immediately, then how to handle the response? whether it is closed or not? in other words what is the behavior of the socket system call close on a non-blocking socket?
It's not the blocking state of the socket, it's the SO_LINGER
option that matters. From getsockopt(2)
:
SO_LINGER
controls the action taken when unsent messages are queued on socket and aclose(2)
is performed. If the socket promises reliable delivery of data andSO_LINGER
is set, the system will block the process on theclose(2)
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 seconds in thesetsockopt()
system call whenSO_LINGER
is requested). IfSO_LINGER
is disabled and aclose(2)
is issued, the system will process the close in a manner that allows the process to continue as quickly as possible.
That is, with SO_LINGER
enabled an error from close(2)
on TCP socket would mean that kernel was not able to deliver data within linger interval (not counting other errors like invalid file descriptor, etc.). With lingering disabled - you never know. Also see The ultimate SO_LINGER page, or why is my tcp not reliable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With