C# Socket連接 無法訪問已釋放的對象
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
在進(jìn)行Socket長連接時,若服務(wù)器或客戶端出現(xiàn)異常時,另外一端對Socket對話進(jìn)行操作時,程序會出現(xiàn)無法訪問已釋放的對象的問題。例如客戶端出現(xiàn)問題主動斷開Socket時,當(dāng)服務(wù)器操作Socket時,比如主動斷開Socket會話,那么程序會出現(xiàn)“無法方位已釋放的對象”,是由于客戶端的原因?qū)е路?wù)器和客戶端的Socket已經(jīng)不存在或連接已經(jīng)斷開,即Socket已經(jīng)釋放,服務(wù)器再操作服務(wù)器和客戶端的Socket肯定會報錯,因此在服務(wù)器或客戶端一側(cè)操作Socket時,必須首先判斷Socket是否存在、連接是否正常,只有存在且連接正常的Socket才允許操作。以服務(wù)器斷開Socket為例: //判斷Socket是否存在且連接正常,存在且連接正常的Socket才運(yùn)行進(jìn)行斷開操作 if (_cliSock != null && _cliSock.Connected) //關(guān)閉Socket之前,首選需要把雙方的Socket Shutdown掉 //Shutdown掉Socket后主線程停止10ms,保證Socket的Shutdown完成 //關(guān)閉客戶端Socket,清理資源 } 注:Socket對話就相當(dāng)于兩個國家(A和C)通過貿(mào)易渠道進(jìn)行稀土交易,正常情況下,A、C國家正常支持該貿(mào)易,貿(mào)易可以正常進(jìn)行,若C國家法律禁止稀土出口,主動關(guān)閉了該貿(mào)易通道,但是A國家并不知道,那么A國家發(fā)往C國的所有貿(mào)易請求將會被丟失,對貿(mào)易通道所有的維護(hù)都將失敗,所以需要在C國執(zhí)行法律時(即Close())之前,需要關(guān)閉雙方的貿(mào)易通道(即 SocketShutdown.Both),然后等待最后一批在貿(mào)易通道的貨物成功運(yùn)送至A國(即主線層休眠10ms),再執(zhí)行法律,真正關(guān)閉Socket連接。 該文章在 2017/4/12 1:07:30 編輯過
|
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |