【问题标题】:.NET Socket Listen backlog.NET 套接字侦听积压
【发布时间】:2011-01-08 08:38:31
【问题描述】:

我有一个服务器套接字,我已将其配置为一次允许一个连接(通过阻止带有信号量的 Accept 调用),积压队列大小为 1。也就是说,我调用了 .Listen(1)。

然后我遵循以下过程:

  • 我在服务器套接字上调用 AcceptAsync(仅一次)
  • 我有一个客户端 ConnectAsync(连接成功)
  • 我有一个客户端 ConnectAsync(连接成功,据说在队列中...一种告诉方式会很好)
  • 我有第三个客户端 ConnectAsync

这三个 ConnectAsync 调用快速连续发生。

第三个 ConnectAsync 的预期结果是使 SocketAsyncEventArgs 的“SocketError”属性不是“SocketError.Success”。我实际上希望“SocketError.ConnectionRefused”是具体的。

大约 95% 的时间都是这种情况。第三个客户端的回调给了我一个 SocketError 值而不是 Success。

不过,第三个 ConnectAsync 时不时地“工作”,就像第二个一样。 EventArgs.SocketError 给了我 SocketError.Success,相应的 Socket.Connected 属性为“true”。

发生了什么事?我准确地调用了 AcceptAsync 一次(我已经用断点仔细验证了这一点),所以应该只接受一个客户端,其余的应该在积压队列中。我的队列大小是1,那么第三个客户端是怎么连接成功的呢?

请不要告诉我使用更大的队列大小。这是针对我编写的测试功能,而不是主动为客户服务的代码。这个时候就比较好奇了。 :)

【问题讨论】:

  • 您的第二个待处理连接是否已关闭(在调试期间)并且似乎还有一个连接的位置?
  • 我不这么认为。我有一个断点集,在尝试连接后 5 秒触发。那时,如果我检查所有三个套接字,所有三个套接字都将 .Connected 设置为 true。

标签: .net sockets asynchronous listen backlog


【解决方案1】:

那是行不通的。系统会将您的收听积压 1 提高到它自己的最小值,即至少 50。

只需将您的服务器设为单线程即可。然后它将一次只处理一个连接。后续连接将在积压队列中等待。当积压队列已满时,他们将收到“连接被拒绝”如果服务器是 Windows 平台。不然。

【讨论】:

  • 只有,它确实有效,几乎每次都有效。测试只是偶尔失败。我在问什么情况导致它失败。就像我说的,我对在生产环境中运行这种服务器不感兴趣。问题是为了满足我自己的好奇心。
  • @Sapph:它可能会起作用,但不是因为这个原因。 Windows 上的最小积压值为 5(Winsock 规范)。而且你很难将“只是偶尔失败”称为成功。
  • 好吧,我们可以试着弄清楚为什么它大部分时间都在工作吗? .NET 框架是否尝试强制执行单独的软件限制而不考虑操作系统规范? “为什么”是这个问题的全部要点。 :)
  • 我无法评论 .NET 框架,也无法评论为什么您的代码在没有看到它的情况下工作。
猜你喜欢
  • 2017-04-27
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2011-12-10
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多