我正在开发开源套接字服务器库:https://sourceforge.net/projects/socketservers/
我想在这个lib中添加套接字重用功能。我已经实现了这个功能的草稿,但我没有看到我的测试有任何好处。客户端通过8个项目将32K连接断开连接到服务器并测量时间。但是重用套接字和不重用套接字没有区别 - 这个测试已经过了相同的时间。
我在测试中做错了什么?
服务器在重用套接字时应该获得什么好处,以及如何衡量这种好处?
答案 0 :(得分:2)
我可以解释从非托管的角度发生了什么,以及如何使用DisconnectEx()
,也许有人可以将其映射到托管方案。
在非托管代码中,您可以使用DisconnectEx()
为后续AcceptEx()
或ConnectEx()
调用重用套接字,更可能是前者。因此,您最初使用AcceptEx()
创建x套接字并发布重叠的异步接受操作。当客户端连接到这些挂起的连接时,您将执行服务器的操作,然后在套接字上调用DisconnectEx()
并使用该套接字发布新的AcceptEx()
。这避免了在此时创建新套接字的需要,因此对服务器来说更有效。性能差异可能非常小,但值得拥有大量短期连接的负载很重的服务器。
因此,我建议您发布一些代码,说明如何在调用Disconnect(true)
后重新使用套接字...
答案 1 :(得分:0)
问题是操作系统或运行时在调用新套接字时是否自动执行重用。
Socket.Disconnect方法文档指向了这个方向:
关闭套接字连接并允许重用套接字。所以这似乎是一种过度优化。
答案 2 :(得分:0)
如果您的意思是SO_REUSEADDR或SO_REUSEPORT:
套接字重用在以下情况下非常重要:你的服务器崩溃,但仍有连接延迟。
如果重新启动服务器,通常必须等到操作系统正常关闭这些连接,然后才能将套接字重新绑定到该端口。
这可能意味着,一些严重依赖服务器的进程会在重新启动之前停止运行。
由于套接字重用功能,您可以避免此问题。
这可能有其他用途,但我现在只能想到这一点。 希望有所帮助。