C#socket通訊兩個最經典錯誤解決方案

https://blog.csdn.net/iceagezh/article/details/70239211

 

1、經典錯誤之 無法訪問已釋放的對象。 對象名:“System.Net.Sockets.Socket”

(1)、問題現場

image

(2)、問題敘述

程序中的某個地方調用到了socket.close後,這個socket還被調用,就出爆出上面錯誤!

 

 

(3)、解決方案

使用下面一句: 


if (stsend != null && stsend.Connected)

stsend != null :這一句在socket.close之後,會無效的,因爲關閉socket連接時已經將其所有連接的資源都釋放了;故要與Connected全用;

stsend.Connected:獲取一個值,該值指示 Socket上次操作是Send還是Receive形式連接到遠程主機,如果都不是,那就是斷開了。

擴展說明:

所有非託管資源程序員必須能控制資源釋放,諸如數據庫連接,SOCKET連接等在使用後都應當顯示關閉,如果是長連接,在程序退出時應當確保所有佔用的連接都被關閉。

 

2、經典錯誤之 "遠程主機強迫關閉了一個現有的連接。"

 

(1)問題現場

image

 

(2)、問題敘述

   如下圖,對於網絡的經典問題,由於是server和client中的任意一方主動斷開連接,導致彈出 “遠程主機強迫關閉了一個現在連接”的異常。這種情況,會導致程序提示異常,無法繼續往下執行。

 

(3)、解決方案

可以通過異常處理的方式,通過異常來提示網絡不正常,從而跳出該程序分支,不至於因爲異常問題程序癱瘓!

如下圖,一Catch到這類System.Net.Sockets.SocketException異常(當然這裏把它設爲Exceptioin異常,抓取的範圍更廣),那麼就用MessageBox給用戶一個提示,然後從該分支退出就行了。

image

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章