如何closures一个无阻塞的套接字?

我相信,如果我们在一个非阻塞套接字上调用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不可靠 。