我在正确关闭 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核心中的那个,维护的代码更少