我正在尝试创建一个可以处理多个并发连接的异步tcp服务器。然后,我已经阅读了MSDN中显示的示例:
https://msdn.microsoft.com/en-us/library/fx6588te.aspx
但我很高兴我将AcceptCallback函数中的异步接收更改为同步接收,所以现在我的AcceptCallback函数变为:
private void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// Sync receive
byte[] buff = new byte[1024];
handler.Receive(buff);
ConsumeMessage(handler, buff);
}
然后,我的tcp服务器无法再处理多个并发连接。如果有两个并发连接,则它只能连接一个客户端,另一个仍然在连接队列中。环顾四周后,我找到了这篇文章:
Asynchronous server socket multiple clients
Groo提到: "要允许多个并发连接,您需要使用handler.BeginReceive创建一个接收套接字,然后调用listener.BeginAccept开始侦听新客户端。"
有人可以解释为什么我们需要在这里使用AsyncReceive来处理多个连接吗?如果我想使用SyncReceive,有没有办法让它仍然能够处理多个连接?
答案 0 :(得分:1)
任何线程一次只能做一件事。默认情况下,Receive
调用阻塞直到数据可用,这会阻止任何其他代码(例如接受新连接)在该线程上运行。
您当然可以为每个单独的连接创建一个线程,您可以在该连接上同步接收数据,但最终您将模拟BeginReceive
的方式,并且需要自己管理这些线程的开销。
有一些替代方法允许同步处理,例如非阻塞套接字和使用Socket.Select()
,但不建议使用它们(非阻塞套接字需要轮询,并且Socket.Select()
很难获得右)。
答案 1 :(得分:0)
BeginAccept 仅接受单个传入连接。如果您想继续接受新的传入连接,则必须在 AcceptCallback 中再次调用 BeginAccept 。
话虽如此,我建议调查高级通信库或WCF等框架。做正确的低级网络编程是非常棘手的。