簡體   English   中英

異步客戶端句柄接收?

[英]Async client handle receive?

我多次被告知異步更好,或者我應該使用異步而不是同步套接字,因此開始學習它,但是已經很困難了。

我對回調如何工作以及如何建立連接有基本的了解。

我正在使用此msdn代碼作為參考!

我的代碼有一些問題:

  • 當前,該代碼將連接到服務器,發送文本,讀取響應並退出。 我該如何做才能繼續接收數據,直到服務器斷開我的連接和/或我自己結束該數據為止? 如果我需要使用while或簡單的調用將其包裝在線程上,一旦ReceiveCallback完成,則再次接收,我不太確定該怎么做。

  • 我注意到的另一件事是,當連接時,套接字已分配給客戶端,但是代碼本身總是在重新分配客戶端套接字,與同步套接字相比,我不太了解,我們有一個主套接字,我們一直在咨詢等等

我不確定我使用的參考文獻的年齡,但是如果您能通過我所指出的示例幫助我,將不勝感激,因為它使我更容易理解。

更新:

    private void SetupRecieveCallback(Socket sock)
    {
        new Thread(
            delegate()
            {
                while (isReceiving)
                {
                    _receiveQueue.Reset();
                    try
                    {
                        AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                        sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error("Setup Recieve Callback failed! " + ex.Message);
                    }
                    _receiveQueue.WaitOne();
                }
            }
        ).Start();
        /*
                    // The original code
        try
        {
            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
            sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock);
        }
        catch (Exception ex)
        {
            _logger.Error("Setup Recieve Callback failed! " + ex.Message);
        }
        */
    }

只需在回調中再次調用BeginReceive()即可繼續接收。 當服務器斷開連接時,您的回調將被調用,EndReceive()引發ObjectDisposedException。 這就是您停止調用BeginReceive()的方式。

第二個問題更難解碼(只問一個)。 我猜你對這個說法感到困惑:

private static void ConnectCallback(IAsyncResult ar) {
    try {
        // Retrieve the socket from the state object.
        Socket client = (Socket) ar.AsyncState;
        // etc..

這里沒有發生重新分配套接字的情況。 該代碼僅檢索對原始套接字的引用。 這是一項有用的技術,它允許多個連接使用此回調。 該語句將ar.AsyncState值設置為套接字:

        client.BeginConnect( remoteEP, 
            new AsyncCallback(ConnectCallback), client);

請注意如何將客戶端傳遞給AsyncCallback構造函數。 在回調中檢索到的客戶端完全相同。 可以傳遞任何對象。

暫無
暫無

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

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