2010-01-04 103 views
2

Socket类有一个方法.AcceptAsync,它返回true或false。异步套接字 - 处理false socket.AcceptAsync值

我以为假返回值是一个错误情况,但在样品中微软提供了他们调用回调函数检查失败后同步异步插座,如下所示:

public void StartAccept(SocketAsyncEventArgs acceptEventArg) 
    { 
     if (acceptEventArg == null) 
     { 
      acceptEventArg = new SocketAsyncEventArgs(); 
      acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed); 
     } 
     else 
     { 
      // socket must be cleared since the context object is being reused 
      acceptEventArg.AcceptSocket = null; 
     } 

     m_maxNumberAcceptedClients.WaitOne(); 
     bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg); 
     if (!willRaiseEvent) 
     { 
      ProcessAccept(acceptEventArg); 
     } 
    } 

    /// <summary> 
    /// This method is the callback method associated with Socket.AcceptAsync operations and is invoked 
    /// when an accept operation is complete 
    /// </summary> 
    void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     ProcessAccept(e); 
    } 

为什么他们这样做?它破坏了异步套接字的用途并停止了方法返回。

+0

关键是要将两个完全不同的行为绑定到一个似乎只明确指出一个的函数。它被彻底记录的好事情......等等。我分享你的挫折感。 – QueueHammer 2010-03-16 19:49:10

回答

4

AcceptAsync规格:

返回如果I/O操作 同步完成。所述 SocketAsyncEventArgs.Completed 事件e参数不会 升高和作为 参数传递电子对象可被该方法调用返回到 后立即检查 检索操作的结果。

当它返回false时,你应该直接处理新接受的套接字。

1

正如Remus所说,当它返回false时,你会同步处理它,而不是异步处理它。

是的,您似乎很奇怪您正在同步处理异步调用,但通常只有在调用AcceptAsync时已有连接等待接受时才会发生。由于那里已经有连接,所以不需要经历异步I/O调用,并且同步处理它更快并且使用更少的资源。

0

即使通过调用局域网上的Thread.Sleep,以确保所有数据都已从客户端到达,但我无法使AcceptAsync或ReceiveAsync返回false,并使用TCP使用默认的Socket选项返回false。我想知道是否有可能使用一些独特的选项或者UDP返回false,或者使用NoDelay发送选项。无论如何,很容易编写它返回false的可能性。

0

如果返回方法false表示:操作已完成

所以如果它返回true操作尚未完成

概括起来:

  • 如果该方法返回false,立即处理。
  • 如果方法返回true,请在事件触发时处理它。

希望这对我有所帮助。