標籤:
問題1.無法訪問已釋放的對象。 對象名:“System.Net.Sockets.Socket"
產生這個scenario的原因是程式中的某個地方調用到了socket.close後,這個socket還被調用。對此,可以在使用Send/SendAsync或Receive/ReceiveAsync方法是首先判斷一下Socket對象是否已經釋放並且串連還在:
if (stsend != null && stsend.Connected)
{
//your code...
}
所有非託管資來源程式員必須能控制資源釋放,諸如資料庫連接,SOCKET串連等在使用後都應當顯示關閉,如果是長串連,在程式退出時應當確保所有佔用的串連都被關閉。
問題2."遠程主機強迫關閉了一個現有的串連。"
一般是由於是server和client中的任意一方主動中斷連線,導致彈出 “遠程主機強迫關閉了一個現在串連”的異常。這種情況,會導致程式提示異常,無法繼續往下執行。
可以通過異常處理的方式,通過異常來提示網路不正常,從而跳出該程式分支,不至於因為異常問題程式癱瘓!
如,一Catch到這類System.Net.Sockets.SocketException異常(當然這裡把它設為Exceptioin異常,抓取的範圍更廣),那麼就用MessageBox給使用者一個提示,然後從該分支退出就行了。
private void ReceiveRecordBodyCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
try
{
if (state != null && state.workSocket.Connected)
{
}
}
catch (Exception e)
{
asyncSocketServer.CloseAndDisposeConnection(state, e.ToString(), ErrorLevel.Level1);
}
}
問題3.由於電腦積極拒絕。。無法串連。
這通常是目標機沒有開啟該連接埠的偵聽,比如服務端沒有啟動,IP可以PING通,但是connect到連接埠會被拒絕.查看服務端和用戶端是否都有正確配置監聽連接埠和串連。
問題4.引發類型system.outofmemoryExeption異常。
一種可能是在一個迴圈裡開啟了監聽但是沒有阻斷線程:
"AcceptClientsAsync(listener, cts.Token)"由於是非同步在調完之後就會立即返回然後繼續下一次調用,這樣就在無限迴圈了。
可以把下一個串連放在上一個串連的AceeptCallBack中:
private void AcceptCallback(IAsyncResult ar)
{
StateObject state = null;
try
{
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
//接受下一次串連
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
}
}
問題4.通常每個通訊端()只允許使用1次。
已經對某連接埠進行了偵聽,代碼重複執行,又對同一連接埠偵聽.
問題5.您的主機軟體中止了一個已建立的串連。
這是服務端關閉,用戶端拋出的異常,需要診斷服務端代碼.建議在伺服器端部署一套詳細的日誌系統這樣出問題後可以快速找到問題。
問題6.非同步通訊中長串連問題
這是個很常見的問題,產生原因一把由於網路不通暢造成資料延遲接收或發送,可以設定一個心跳包機制,即在程式閒置時候每隔一定時間就向對端發送一個很小的資料包,然後對端接受到後也發回同樣的包,以確保雙方都知道串連還在,否則就設定逾時,踢掉對端。
[.NET] - 在Socket編程中遇到的問題總結