1

我有一个服务器套接字,我已将其配置为一次允许一个连接(通过使用信号量阻止接受调用),积压队列大小为 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,那么第三个客户端如何不时连接成功?

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

4

1 回答 1

0

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

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

于 2011-01-10T23:30:10.283 回答