我相信如果我们在非阻塞套接字上调用close系统调用,它会立即返回,那么如何处理响应?无论它是关闭还是没有关闭? 换句话说,在非阻塞套接字上调用socket系统调用的行为是什么?
我相信如果我们在非阻塞套接字上调用close系统调用,它会立即返回,那么如何处理响应?无论它是关闭还是没有关闭? 换句话说,在非阻塞套接字上调用socket系统调用的行为是什么?
SO_LINGER
选项很重要。从getsockopt(2)
中可以得知:当套接字有未发送的消息排队并执行close(2)
时,SO_LINGER
控制采取的操作。如果套接字承诺可靠传输数据并设置了SO_LINGER
,系统将在close(2)
尝试上阻止进程,直到它能够传输数据或者决定无法传递信息(指定延迟间隔期,以秒为单位,在请求SO_LINGER
时在setsockopt()
系统调用中)。如果禁用了SO_LINGER
并且发出了一个close(2)
,则系统将以使进程能够尽快继续进行的方式处理关闭。
也就是说,启用SO_LINGER
,TCP套接字上的close(2)
错误意味着内核无法在挂起时间内交付数据(不计算其他错误,如无效的文件描述符等)。禁用挂起 - 您永远不知道。另请参见The ultimate SO_LINGER page, or why is my tcp not reliable。errno == EAGAIN/EWOULDBLOCK
。这是一个非常模糊的领域。 - user207421