如何关闭非阻塞套接字?

时间:2011-06-20 22:22:54

标签: linux sockets freebsd nonblocking

我相信如果我们在非阻塞套接字上调用close系统调用它立即返回,那么如何处理响应?是否关闭? 换句话说,套接字系统调用close在非阻塞套接字上的行为是什么?

2 个答案:

答案 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关闭之前将套接字重新置于阻塞模式。