2010-01-04 87 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,請在事件觸發時處理它。

希望這對我有所幫助。