.NET Socket监听积压

时间:2011-01-08 08:38:31

标签: .net sockets asynchronous listen backlog

我有一个服务器套接字,我已配置为允许一次连接(通过使用信号量阻止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,那么第三个客户端如何连续成功连接?

请不要告诉我使用更大的队列大小。这是我编写的测试函数,而不是主动为客户提供服务的代码。在这一点上,它更加好奇。 :)

1 个答案:

答案 0 :(得分:0)

那不行。系统会将您的监听积压1提高到自己的最小值,最小值为50。

只需使您的服务器具有单线程。然后它一次只处理一个连接。后续连接将在积压队列中等待。当积压队列已满时,如果服务器是Windows平台,则会“拒绝连接”。不是这样。