【问题标题】:System.Net.WebSockets leaving sockets in close_wait after disconnectSystem.Net.WebSockets 在断开连接后将套接字留在 close_wait
【发布时间】:2020-10-16 08:41:32
【问题描述】:

我在正确关闭 System.Net.WebSockets 连接时遇到问题。

经过一番谷歌搜索后,甚至发现有人解释了如何正确执行此操作,但他自己的示例将套接字留在 close_wait 中。

我会使用那个人的样本,因为他的解释很好,博文在这里:

https://mcguirev10.com/2019/08/17/how-to-close-websocket-correctly.html

github 上的示例:

https://github.com/MV10/WebSocketExample

要重现,请查看 git repo

使用 System.Net.WebSockets 构建客户端和服务器应用程序:

dotnet build ./WebSocketExample/WebSocketExample.csproj
dotnet build ./WebSocketClient/WebSocketClient.csproj 

运行它们:

./WebSocketExample/bin/Debug/netcoreapp3.0/WebSocketExample
./WebSocketClient/bin/Debug/netcoreapp3.1/WebSocketClient

我在 linux 上运行它,所以请注意这样的套接字:

watch -n 2 'netstat -anp | grep ":8080" | grep "CLOSE_WAIT"'

现在,在客户端上,按 ESC 键,将显示 CLOSE_WAIT 套接字。
如果只有几个连接,这将不是问题,但在谈论成百上千时,我们会遇到资源限制。

我知道 close_wait 意味着客户端连接已发送它的关闭 (FIN),现在由服务器来清理/关闭套接字。

此示例中的连接未正确关闭/清理有什么问题?


编辑:

一些附加信息,尝试了我在 github 上找到的 System.Net.WebSockets 的实现,并且它似乎确实按预期工作:

https://github.com/ninjasource/Ninja.WebSockets

我宁愿使用 .net 内核中的那个,维护的代码更少

【问题讨论】:

    标签: c# .net-core websocket system.net.websockets


    【解决方案1】:

    找到了在 .net 核心 github 问题跟踪器上使用 System.Net.WebSockets 时的解决方法。

    这里讨论过: https://github.com/dotnet/runtime/issues/27469

    解决方案似乎是:

    var context = listener.GetContext();
    var res = context.Response;
    res.StatusCode = 200;
    res.OutputStream.Write(buffer, 0, buffer.Length);
    res.OutputStream.Flush();
    res.OutputStream.Dispose();
    res.Close();    // the magic
    

    说它已修复,不要认为它已完全修复为当前运行的 .net core 3.1,如果不这样做,很多套接字会在 close_wait 中停留一段时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-28
      • 2013-04-01
      • 2019-06-07
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多