發生未處理的域異常!
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
at System.Net.Sockets.Socket.SendAsync(SocketAsyncEventArgs e)
在進行Socket長連接時,若服務器或客戶端出現異常時,另外一端對Socket對話進行操作時,程序會出現無法訪問已釋放的對象的問題。例如客戶端出現問題主動斷開Socket時,當服務器操作Socket時,比如主動斷開Socket會話,那么程序會出現“無法方位已釋放的對象”,是由於客戶端的原因導致服務器和客戶端的Socket已經不存在或連接已經斷開,即Socket已經釋放,服務器再操作服務器和客戶端的Socket肯定會報錯,因此在服務器或客戶端一側操作Socket時,必須首先判斷Socket是否存在、連接是否正常,只有存在且連接正常的Socket才允許操作。
例子1:以服務器斷開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();
}
例子2:
if (socket != null && socket.Connected && !socket.SendAsync(e))