簡體   English   中英

將 SocketAsyncEventArgs 與 ReceiveAsync 重用會導致無限循環

[英]Reusing SocketAsyncEventArgs with ReceiveAsync results in infinite loop

我正在編寫一個只使用一個套接字的簡單套接字客戶端。 所以我想我可以為所有接收操作重用一個 SocketAsyncEventArgs。 只要連接了插座,它就可以正常工作。 當服務器斷開連接時,客戶端將進入無限接收循環,在控制台中發送垃圾郵件“接收成功”。

不應該 e.SocketError.= SocketError?Success 在socket斷開時為真?

這是代碼的一部分:

private void Completed(object sender, SocketAsyncEventArgs e)
{
   if (e.SocketError != SocketError.Success)
      status = 0;

   System.Console.WriteLine(e.LastOperation + " " + e.SocketError);

   if (status == 1)
   {
      switch (e.LastOperation)
      {
         case SocketAsyncOperation.Connect:
            ProcessConnect(e);
            break;
         case SocketAsyncOperation.Receive:
            ProcessReceive(e);
            break;
         case SocketAsyncOperation.Send:
            ProcessSend(e);
            break;
         default:
            status = 0;
            break;
      }
   }

   if (status != 1)
      CloseSocket();
}

private void ProcessReceive(SocketAsyncEventArgs e)
{
   if (!socket.ReceiveAsync(e))
      Completed(null, e);
}

如果你的套接字是為字節流設置的,那么你可能會得到一個零字節的回調,這表明套接字已經正常關閉並且不會再讀取任何字節。 只需在您的代碼中檢查一下,例如

private void ProcessReceive( SocketAsyncEventArgs e )
{
    AsyncUserToken token = e.UserToken as AsyncUserToken;
    if( e.ByteTransferred > 0 && e.SocketError == SocketError.Success )
    {
        // .. process normally ..
    }
    else
    {
        CloseClientSocket( e );
    }
}

private void CloseClientSocket( SocketAsyncEventArgs e )
{
    AsyncUserToken token = e.UserToken as AsyncUserToken;
    try
    {
        token.Socket.Shutdown( SocketShutdown.Send );
    }
    // throws error if it's already closed
    catch( Exception ) {}
    token.Socket.Close();
}

當然,您還需要阻止您的客戶端嘗試使用套接字,但我相信您可以解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM