Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to close a non-blocking socket?

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?

like image 536
alexander Avatar asked Jun 20 '11 22:06

alexander


1 Answers

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 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(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 the setsockopt() system call when SO_LINGER is requested). If SO_LINGER is disabled and a close(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.

like image 54
Nikolai Fetissov Avatar answered Sep 20 '22 21:09

Nikolai Fetissov