遠程協助開發總結(三)
這裏主要總結一下這段時間對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
clientThread.Abort();
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
所以接下來我來介紹一下到底該怎樣正確的關閉連接,避免異常產生,以上所有異常的產生歸根結底是Close的時機不對造成的,如果我們手動關閉一個套接字,正確的做法是只要Shutdown就可以了,後面不要緊跟著Close方法
當Shutdown的時候,這時候無論是本地套接字還是遠程套接字都會空接退出循環,我們可以把Close放在循環體外面,分別關閉它們。
遠程協助開發總結(三)