系统.网WebSockets在断开连接后使套接字处于关闭等待状态



我在关闭系统时遇到问题。网WebSockets连接正确。

经过一些谷歌搜索,甚至找到了一个人来解释如何正确地完成这项工作,但他自己的样本却让插座处于关闭状态。

我将使用这些人的样本,因为他的解释很好,博客文章在这里:

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

github上的样本在这里:

https://github.com/MV10/WebSocketExample

要复制,请查看git-reo

使用系统构建客户端和服务器应用程序。网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上发现的WebSockets,它似乎确实像预期的那样工作:

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

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

找到了使用系统时的解决方法。网.net核心github问题跟踪器上的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内核3.1,如果不这样做,很多套接字会在关闭等待一段时间。

相关内容

  • 没有找到相关文章

最新更新