问题标签 [so-linger]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - SO_LINGER 和关闭套接字(WINSOCK)
我正在编写一个多线程的 Winsock 应用程序,并且在关闭套接字时遇到了一些问题。首先,同时打开的套接字数量是否有限制?让我们说像32个插座一样。
我在其中一个套接字上建立连接,并传递信息,一切正常。问题是当我断开套接字然后重新连接到同一个目的地时,我在 SYN 之后从服务器获得 RST。我没有服务器应用程序的代码,所以我无法调试它。
当我使用 SO_LINGER 并在每个会话结束时发送一个 RST 标志时 - 它起作用了。但我不想以这种方式结束我的联系。当不使用 SO_LINGER 时,发送了一个 FIN 标志,但似乎连接并没有真正关闭。
有什么帮助吗?谢谢
sockets - 什么时候需要 TCP 选项 SO_LINGER (0)?
我想我理解该选项的正式含义。在我现在处理的一些遗留代码中,使用了该选项。客户抱怨 RST 是从其一侧对 FIN 的响应,因为它从其一侧关闭连接。
我不确定我是否可以安全地移除它,因为我不知道什么时候应该使用它。
您能否举例说明何时需要该选项?
scala - 发送答案后,Scala喷雾立即关闭连接
scala spray如何在发送答案后立即关闭连接?
在其他 http 服务器中我m set tcp options
so_linger` = 0
我可以在哪里设置 spray_can 中的 so_linger 参数?
c - 确定 TCP 连接在 C 中真正关闭的时刻
我只需要在 TCP 连接完全关闭后执行一些操作,也就是说 - 所有数据段以及完成例程(FIN-ACK 或 RST)都已执行并完成,并且不会有任何数据包在电线上发送。
由于closesocket()
不是同步的并且可以在连接和套接字完全关闭之前返回,我使用该SO_LINGER
选项来获取关闭的时刻。
根据 MSDN 中关于 closesocket 的说明,以及我的套接字是非阻塞的(因此是异步的)这一事实,我编写了以下代码:
但是,closesocket 调用返回零(成功;而不是进入循环),我在 Wireshark 中看到我的最终打印是在所有数据包发送之前调用的,所以 - 看起来 linger 不起作用。
顺便说一句,我用来打开和连接异步套接字的函数是socket()
,WSAIoctl()
以及它的lpfnConnectEx()
回调。
在 TCP 连接完全完成之前,徘徊的 closesocket 返回的原因是什么?有解决办法吗?
c - 为什么具有 0 超时或 10 秒超时的 SO_LINGER 选项不立即或在 10 秒后不删除套接字?
我已阅读何时需要 TCP 选项 SO_LINGER (0)?以及其他几个相关的问题和答案,但我无法重现SO_LINGER
这些帖子中解释的任何行为。我将在这里分享我的许多实验之一。
我在以下环境中进行这个实验。
这是一个连接到服务器的行为不端的客户端的示例,但在 90 秒内没有收到任何数据。
这是我的服务器代码,它发送hello
给连接到服务器的每个客户端,然后立即关闭连接。为简单起见,此服务器不是多线程的。在一个多线程服务器中,它将接受来自客户端的 100 个连接的连接,其中许多可能是行为不端的,我们的目标是尽快丢弃无用的套接字,以便释放为这些套接字使用的端口。
为了实现这一点,我们启用了SO_LINGER
延迟超时 10 秒的套接字选项。
这是我的实验跑步者。
在另一个窗口/终端中,我运行这个小 bash 脚本以每 10 秒监视一次套接字的状态。
上面的输出显示服务器套接字(输出的每次迭代中的第三行)保持FIN_WAIT2
状态 60 秒(即默认时间等待)。
为什么SO_LINGER
超时10
秒的选项并不能确保服务器在 10 秒后成功关闭其客户端套接字(即本地地址 = 127.0.0.1:8000;外部地址 = 127.0.0.1:35536)?
注意:即使超时为 0,我也得到相同的结果,即使用以下代码,本地地址 = 127.0.0.1:8000 和外部地址 = 127.0.0.1:35536 的套接字保持FIN_WAIT2
状态 60 秒。
如果SO_LINGER
对套接字的删除或FIN_WAIT2
超时没有影响,那么真正的目的是SO_LINGER
什么?
c - 当内核重新启动时,延迟套接字会发生什么?
我试图了解以下场景的典型行为。请注意,我愿意为任何操作系统(*nix、Windows、...)找到更多关于这个边缘案例的信息。
如果应用程序被阻塞等待或延迟套接字关闭,当机器重新启动时会发生什么?
考虑以下示例场景:
应用程序有一个已建立的 TCP 套接字,然后在该套接字上调用 close()。套接字配置为逗留 (SO_LINGER) 10 秒。
由于延迟设置,应用程序会阻塞,等待(最多)10 秒的延迟时间以 TX/RX/ACK 连接上的剩余数据。
在此期间,内核重新启动(例如,用户重新启动机器)。
在这种情况下内核会做什么?
它是否强制套接字关闭(“中止关闭”)?导致任何未发送/未确认的数据丢失?
或者它是否尊重逗留时间并等待(可能)整整 10 秒?(因此阻止重新启动,可能直到整整 10 秒的逗留时间到期)。
还有什么?
谢谢,
史蒂夫
java - 不应该将 SoLinger 设置为假切断此连接吗?
据我了解, linger 是一种设置,允许在关闭后使连接保持一些延迟,以便有时间读取最终数据。
我有这个例子:
和输出
2怎么读?逗留被禁用,从睡眠中醒来时套接字不应该处于不可读状态?
c - 使用 SO_LINGER 关闭套接字不会发送 RST 数据包
当关闭与客户端的 TCP 连接时,客户端应用程序只会在连接重置时(发送 RST 数据包)以可见的方式响应用户。目前,我无法修改客户端应用程序。
在研究这个时,这样做的主要方法是打开 SO_LINGER,逗留时间为 0。但是,我注意到套接字按预期关闭(例如,在系统默认时间不停留在 TIME_WAIT),但不发送一个 RST 数据包到客户端。
我已经在 WSL2 和 Ubuntu(作为它自己的 VM,而不是 WSL 的一部分)中对此进行了测试,并且两者都没有发送预期的数据包。
服务器套接字(listen()
s 的那个)打开了 SO_REUSEADDR 选项,客户端套接字(那个accept()
ed)正确设置了 SO_LINGER 选项,以及 TCP_NODELAY 设置。
需要注意的是,服务器为每个接受的套接字创建一个线程。我不确定这是否会影响问题。我还尝试了其他人在其他问题中发布的一些解决方案,但似乎都没有奏效。
我偶尔会看到在执行几次服务器后发送wireshark RST(当我更新代码等时),但是当它们关闭或进程终止时它们不会立即发送。
上面列出的任何事实是否可能是未发送 RST 数据包的原因,或者是否有需要更改的 linux 系统选项?
提前致谢。让我知道是否需要更多详细信息。