调用setSoLinger与0值并且根本不启用soLinger有什么区别?

在Java中,设置套接字与Socket.setSoLinger(true,0)和不调用setSoLinger之间有区别吗? sockets的关闭方式有区别吗?

我已经查看了Java源代码,并且我没有看到关于soLinger的套接字关闭有什么特别之处。 这让我相信这是一个特定于操作系统的行为。 就我而言,我正在研究Linux。

当通过setSoLinger()指定超时时, close()阻止,直到完成关闭握手,或者直到指定的时间量过去。

但是, close()提供关闭握手未能完成的指示,即使setSoLinger()设置的时间限制在关闭序列完成之前到期。

换句话说, setSoLinger()不会在当前实现中为应用程序提供任何额外的保证。

这是信息的来源。

Socket.setSoLinger(true, 0)实际上是默认值,因此没有任何区别。 然而,请参阅Zaki的答案,为什么即使非零值也无济于事。 Socket.close()忽略超时到期时生成的errno 。 我在大约十年前指出了这个问题并得到了答复,由于向后兼容的原因,它无法改变。 我实际上并不同意,但你去了。 然而,Java 7中的NIO2确实能够识别这种情况并正确抛出exception。