异步服务器套接字示例MSDN

时间:2015-03-24 07:05:37

标签: c# sockets asynchronous tcp

我正在尝试创建一个可以处理多个并发连接的异步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,有没有办法让它仍然能够处理多个连接?

2 个答案:

答案 0 :(得分:1)

任何线程一次只能做一件事。默认情况下,Receive调用阻塞直到数据可用,这会阻止任何其他代码(例如接受新连接)在该线程上运行。

您当然可以为每个单独的连接创建一个线程,您可以在该连接上同步接收数据,但最终您将模拟BeginReceive的方式,并且需要自己管理这些线程的开销。

有一些替代方法允许同步处理,例如非阻塞套接字和使用Socket.Select(),但不建议使用它们(非阻塞套接字需要轮询,并且Socket.Select()很难获得右)。

答案 1 :(得分:0)

BeginAccept 仅接受单个传入连接。如果您想继续接受新的传入连接,则必须在 AcceptCallback 中再次调用 BeginAccept

话虽如此,我建议调查高级通信库或WCF等框架。做正确的低级网络编程是非常棘手的。