C# Socket連線 無法訪問已釋放的物件

liuxixi發表於2016-05-03

在進行Socket長連線時,若伺服器或客戶端出現異常時,另外一端對Socket對話進行操作時,程式會出現無法訪問已釋放的物件的問題。例如客戶端出現問題主動斷開Socket時,當伺服器操作Socket時,比如主動斷開Socket會話,那麼程式會出現“無法方位已釋放的物件”,是由於客戶端的原因導致伺服器和客戶端的Socket已經不存在或連線已經斷開,即Socket已經釋放,伺服器再操作伺服器和客戶端的Socket肯定會報錯,因此在伺服器或客戶端一側操作Socket時,必須首先判斷Socket是否存在、連線是否正常,只有存在且連線正常的Socket才允許操作。以伺服器斷開Socket為例:

                //判斷Socket是否存在且連線正常,存在且連線正常的Socket才執行進行斷開操作 

                if (_cliSock != null && _cliSock.Connected)
                {

                    //關閉Socket之前,首選需要把雙方的Socket Shutdown掉
                    _cliSock.Shutdown(SocketShutdown.Both);

                    //Shutdown掉Socket後主執行緒停止10ms,保證Socket的Shutdown完成
                    System.Threading.Thread.Sleep(10);

                    //關閉客戶端Socket,清理資源
                    _cliSock.Close();

                }

  注:Socket對話就相當於兩個國家(A和C)通過貿易渠道進行稀土交易,正常情況下,A、C國家正常支援該貿易,貿易可以正常進行,若C國家法律禁止稀土出口,主動關閉了該貿易通道,但是A國家並不知道,那麼A國家發往C國的所有貿易請求將會被丟失,對貿易通道所有的維護都將失敗,所以需要在C國執行法律時(即Close())之前,需要關閉雙方的貿易通道(即 SocketShutdown.Both),然後等待最後一批在貿易通道的貨物成功運送至A國(即主線層休眠10ms),再執行法律,真正關閉Socket連線。

本文引自:http://blog.sina.com.cn/s/blog_5f4ffa17010112h7.html

相關文章