1. 程式人生 > >遠程協助開發總結(三)

遠程協助開發總結(三)

線程終止 判斷 call 主動 exce div 一個 解釋 tex

這裏主要總結一下這段時間對Socket編程的總結

1.如何正確的接收數據和如何正確的關閉連接

接收數據要配合正確的關閉連接來使用,關閉連接的時候要先Shutdown本地套接字,這樣遠程套接字就會Receive一個0字節,遠程主機可以根據這個判斷是否關閉連接,如果我們直接Close一個套接字,那麽遠程套接字會直接拋出一個SocketException終止了一個已建立的連接,如果我們可以避免異常的產生盡量不使用異常。

 clientSocket.Shutdown(SocketShutdown.Both);
 clientSocket.Close();

 bufLen = s.Receive(buffer);
 
if (bufLen == 0) { break; }

2.關閉了本地套接字,遠程套接字也要及時關閉

針對一的問題,我們關閉了本地套接字,但是遠程的套接字其實還是打開的狀態,所以要及時關閉。break出循環程序的時候,我們在下面關閉連接,當然關閉的做法和一中的一樣Shutdown->Close

3.如何避免一個封鎖操作被對 WSACancelBlockingCall異常產生

先解釋一下這個異常是怎麽產生的,我們先主動Close掉本地套接字的時候,由於本地套接字也在Receive狀態中,這是一個阻塞的狀態,所以取消一次正在進行中的阻塞調用異常就會拋出來。這個異常本身並不會造成任何危害,因為你套接字已經關閉了,正處於阻塞狀態的Recieve方法調用肯定失去了意義,運行時幫我們取消了這次調用,但是如果你覺得這個異常“別扭”,註意我這裏加了引號,也是可以解決的,那就是我們在關閉一個套接字之前,先把Recieve

的當前線程終止掉,線程終止了,Recieve調用自然不存在了,你再關閉連接的時候自然不會報了,但是這種做法也是那異常換異常,因為強制終止一個異常,套接字正處在一個阻塞狀態,所以會產生一個ThreadAbort異常

clientThread.Abort();
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();

所以接下來我來介紹一下到底該怎樣正確的關閉連接,避免異常產生,以上所有異常的產生歸根結底是Close的時機不對造成的,如果我們手動關閉一個套接字,正確的做法是只要Shutdown就可以了,後面不要緊跟著Close方法

Shutdown的時候,這時候無論是本地套接字還是遠程套接字都會空接退出循環,我們可以把Close放在循環體外面,分別關閉它們。

遠程協助開發總結(三)