C#中的套接字重用有什么好处

时间:2010-11-09 11:29:46

标签: c# sockets reusability

我正在开发开源套接字服务器库:https://sourceforge.net/projects/socketservers/

我想在这个lib中添加套接字重用功能。我已经实现了这个功能的草稿,但我没有看到我的测试有任何好处。客户端通过8个项目将32K连接断开连接到服务器并测量时间。但是重用套接字和不重用套接字没有区别 - 这个测试已经过了相同的时间。

我在测试中做错了什么?

服务器在重用套接字时应该获得什么好处,以及如何衡量这种好处?

3 个答案:

答案 0 :(得分:2)

我可以解释从非托管的角度发生了什么,以及如何使用DisconnectEx(),也许有人可以将其映射到托管方案。

在非托管代码中,您可以使用DisconnectEx()为后续AcceptEx()ConnectEx()调用重用套接字,更可能是前者。因此,您最初使用AcceptEx()创建x套接字并发布重叠的异步接受操作。当客户端连接到这些挂起的连接时,您将执行服务器的操作,然后在套接字上调用DisconnectEx()并使用该套接字发布新的AcceptEx()。这避免了在此时创建新套接字的需要,因此对服务器来说更有效。性能差异可能非常小,但值得拥有大量短期连接的负载很重的服务器。

因此,我建议您发布一些代码,说明如何在调用Disconnect(true)后重新使用套接字...

答案 1 :(得分:0)

问题是操作系统或运行时在调用新套接字时是否自动执行重用。
Socket.Disconnect方法文档指向了这个方向:

关闭套接字连接并允许重用套接字。
所以这似乎是一种过度优化。

答案 2 :(得分:0)

如果您的意思是SO_REUSEADDR或SO_REUSEPORT:

套接字重用在以下情况下非常重要:你的服务器崩溃,但仍有连接延迟。

如果重新启动服务器,通常必须等到操作系统正常关闭这些连接,然后才能将套接字重新绑定到该端口。

这可能意味着,一些严重依赖服务器的进程会在重新启动之前停止运行。

由于套接字重用功能,您可以避免此问题。

这可能有其他用途,但我现在只能想到这一点。 希望有所帮助。