一個封鎖操作被對 WSACancelBlockingCall 的調用中斷 ErrorCode=10004


      C#中在使用UDPClient循環監聽端口,在斷開UPDClient的時候,使用try...catch捕獲了異常,System.NET.Sockets.SocketException一個封鎖操作被對 WSACancelBlockingCall 的調用中斷”,ErrorCode=10004。

      接收時的代碼如下:

IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, 0);
            Thread thread = new Thread(() =>
                    {
                        while (!m_StopListen)
                        {
                            try
                            {
                                if (m_udpClient.Client == null) return;
                                byte[] bytes = m_udpClient.Receive(ref ipendpoint);

                                string str = Encoding.Default.GetString(bytes);
                                Console.WriteLine(string.Format("接收的數據是: {0},來自IP:{1} ,端口 : {2}", str, ipendpoint.Address.ToString(), ipendpoint.Port));

                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(ex.Message);
                            }
                            Thread.Sleep(100);
                        }
                    });
            thread.IsBackground = true;
            thread.Start();

 

       停止監聽的代碼:

            this.m_StopListen = true;
            m_udpClient.Close();
            m_udpClient = null;

       解決辦法:

      在開始調用UDPClient的Receive方法之前對UDPClient.Available屬性進行判斷,當Available屬性大於0時才開始從緩沖區讀取網絡數據:

 

                            try
                            {
                                if (m_udpClient.Available <= 0) continue; 
                                if (m_udpClient.Client == null) return;
                                byte[] bytes = m_udpClient.Receive(ref ipendpoint);

                                string str = Encoding.Default.GetString(bytes);
                                Console.WriteLine(string.Format("接收的數據是: {0},來自IP:{1} ,端口 : {2}", str, ipendpoint.Address.ToString(), ipendpoint.Port));

                            }

 

       原因:MSDN對Available的解釋是:

      “Available 屬性用於確定在網絡緩沖區中排隊等待讀取的數據的量。 如果數據可用,可調用 Read 獲取數據。 如果無數據可用,則 Available 屬性返回 0。

    如果遠程主機處於關機狀態或關閉了連接,則 Available 屬性將引發SocketException如果遠程主機處於關機狀態或關閉了連接,則 Available 屬性將引發SocketException”。

           也就是說,錯誤的原因在於,但調用Close后,線程恰好繼續向網絡緩沖區中讀取數據,所以引發SocketException。

       (如果您知道, Windows Sockets Version 2 API(Windows 套接字第 2 版 API)錯誤代碼文檔 ,可以在那里下載到或者查看,煩請您留個言告訴我一聲啊,謝謝了...)

           

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM