我相信,如果我们在一个非阻塞套接字上调用close系统调用,它立即返回,那么如何处理响应呢? 是否closures? 换句话说,在非阻塞套接字上closures套接字系统调用的行为是什么?
如果我们在非阻塞套接字上调用close系统调用,它立即返回
套接字始终处于关闭状态: 连接仍可能正在写入对等端。 但是你的问题体现了一个谬论:如果你在任何套接字上调用close(),它将立即返回。 关闭并写入套接字是异步的。 你可以用SO_LINGER来控制它,但是我怀疑它只适用于阻塞模式。 如果这是你需要做的,可能你应该把套接字放回到阻塞模式,然后关闭一个积极的SO_LINGER。
这不是套接字的阻塞状态,而是SO_LINGER
选项。 来自getsockopt(2)
:
SO_LINGER
控制未发送消息在套接字上排队并执行close(2)
时所采取的操作。 如果套接字承诺可靠的数据传递并设置了SO_LINGER
,则系统将在close(2)
尝试之前阻塞进程,直到它能够传输数据,或者直到它确定它无法传递信息(超时期限,称为延迟时间间隔,在请求SO_LINGER
时,在setsockopt()
系统调用中以秒为单位指定)。 如果SO_LINGER
被禁用并且close(2)
被发布,则系统将以允许该过程尽可能快地继续的方式来处理关闭。
也就是说,使用SO_LINGER
启用TCP套接字上的close(2)
错误意味着内核不能在逗留间隔内传递数据(不包括其他错误,如无效的文件描述符等)。 残忍的残疾 – 你永远不知道。 另请参阅最终的SO_LINGER页面,或者为什么我的tcp不可靠 。