ale*_*der 6 sockets linux freebsd nonblocking
我相信如果我们在非阻塞套接字上调用close系统调用,它会立即返回,然后如何处理响应?是否关闭?换句话说,套接字系统调用close在非阻塞套接字上的行为是什么?
它不是套接字的阻塞状态,它是重要的SO_LINGER选项.来自getsockopt(2):
SO_LINGER控制当未发送的消息在套接字上排队并close(2)执行a时所采取的操作.如果套接字承诺可靠地传送数据并且SO_LINGER已设置,则系统将阻止close(2)尝试进程,直到它能够传输数据或直到它确定它无法传递信息(超时时段,称为延迟间隔,在请求setsockopt()时在系统调用中以秒为单位指定SO_LINGER).如果SO_LINGER已禁用且close(2)已发出a,则系统将以允许该过程尽可能快地继续的方式处理关闭.
也就是说,SO_LINGER启用close(2)TCP套接字上的错误意味着内核无法在延迟时间间隔内传递数据(不计算其他错误,如无效文件描述符等).随着残疾人的徘徊 - 你永远不知道.另请参阅最终的SO_LINGER页面,或者为什么我的tcp不可靠.
如果我们在非阻塞套接字上调用 close 系统调用,它会立即返回
套接字始终关闭:连接可能仍在向对等方写入数据。但你的问题体现了一个谬误:如果你在任何套接字上调用 close() ,它将立即返回。关闭和写入套接字是异步的。您可以按照其他答案使用 SO_LINGER 进行控制,尽管我怀疑这只适用于阻塞模式。如果您需要这样做,您可能应该在使用正 SO_LINGER 关闭之前将套接字重新置于阻塞模式。
| 归档时间: |
|
| 查看次数: |
5705 次 |
| 最近记录: |