我相信如果我们在非阻塞套接字上调用close系统调用它立即返回,那么如何处理响应?是否关闭? 换句话说,套接字系统调用close在非阻塞套接字上的行为是什么?
答案 0 :(得分:6)
这不是套接字的阻塞状态,重要的是SO_LINGER
选项。来自getsockopt(2)
:
SO_LINGER
控制未发送消息排队时采取的操作 套接字和close(2)
被执行。如果套接字承诺可靠 如果设置了SO_LINGER
数据,系统将阻止该过程 在close(2)
尝试,直到它能够传输数据或直到它 决定它无法传递信息(超时期限,称为 延迟时间间隔在setsockopt()
系统中以秒为单位指定 请求SO_LINGER
时调用。如果SO_LINGER
被禁用且a 发出close(2)
后,系统将以某种方式处理关闭 允许该过程尽快继续。
也就是说,在SO_LINGER
启用close(2)
时,TCP套接字上的{{1}}错误意味着内核无法在延迟时间间隔内传递数据(不计算其他错误,如无效文件描述符等) 。随着残疾人的徘徊 - 你永远不知道。另请参阅The ultimate SO_LINGER page, or why is my tcp not reliable。
答案 1 :(得分:2)
如果我们在a上调用close系统调用 它返回的非阻塞套接字 立即
套接字始终关闭:连接可能仍在写入对等方。但是你的问题体现了一个谬论:如果你在任何套接字上调用close(),它将立即返回。关闭和写入套接字是异步的。你可以根据另一个答案使用SO_LINGER来控制它,尽管我怀疑它只适用于阻塞模式。如果这是你需要做的事情,你可能应该在使用正SO_LINGER关闭之前将套接字重新置于阻塞模式。