【发布时间】: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