最近閱讀了周存傑編寫的《C#網路編程執行個體教程》並閱讀了很多相關方面的資料,同時自己也做了一些通訊端編程方面的C#程式,所以根據它的知識總結了最近的通訊端編程的一些知識點,方便自己的理解與他人的學習,同時也有一些自己以前學習的電腦網路、作業系統等相關知識。
一. 通訊端編程的概念
通訊端(Winsock)是一種獨立於協議的網路編程介面,在OSI中集中在會話層和傳輸層
(補充知識)簡單迴歸網路知識,電腦網路中的”五層協議的體繫結構”和”OSI體繫結構”如所示:
其中它們每層實現的功能,構成的網路通訊簡單的如所示:(“網際層”對應”網路層”,”網路介面層”對應底層的”資料連結層+物理層”)
TCP/IP協議的第一個BSD UNIX提供了一個訪問通訊協定的調用——Socker。Socket類提供了對通訊端的支援,提供了一整套屬性和方法實現對連接埠的綁定、監聽、串連、資料轉送,其中通訊端編程介面使用的命名空間為System.Net.Sockets。
(補充知識)在.Net網路中常用的類如下所示:
Socket:實現構造一個新的通訊端介面對象
Dns:提供簡單的網域名稱解析功能
IPAddress:提供網際協議(IP)地址的支援,其方法含定義擷取主機的IP地址
IPEndPoint:將網路端點表示為IP地址和連接埠號碼
IPHostEntry:為網路主機地址資訊提供容器類,構造一個主機對象
NetworkStream:提供用於網路訪問的基礎資料流
TcpLinster:從TCP網路用戶端監聽串連
TcpClient:為TCP網路服務提供用戶端串連
UdpClient:提供使用者資料報(UDP)網路服務
二.Socket類屬性
Socket類常見屬性如下所示:
AddressFamily:定義通訊端地址家族,常見的為InterNetwork
Available:擷取從網路已接受到的且可以讀取的資料量的大小,存放網路緩衝區中還未處理的資料的大小
Blocking:決定是否是通訊端工作在阻塞模式,預設為False
Connected:擷取通訊端是否串連成功的資訊,True為串連成功,False為串連失敗
Handle:擷取作業系統控制代碼
LocalEndPoint:擷取本地終端的資訊
ProtocolType:定義通訊端使用的協議的類型,常見的為Tcp
RemoteEndPoint:遠程終端資訊
SocketType:定義通訊端類型,資料流或資料包
(補充知識)在網路編程中常使用的兩種方法,socket類亦支援該兩種基本模式——同步和非同步。
同步:對執行網路操作的函數的調用一隻等到操作完成後才將控制返回給調用程式;
非同步:網路操作的函數調用立即返回。
同步方法調用在程式繼續執行之前需要等待同步方法執行完畢返回結果,非同步方法呼叫則在被調用之後立即返回以便程式在被呼叫者法完成其任務的同時執行其它操作。因為同步方法調用會導致程式流程中途等待,所以採用同步方法的情況下往往會導致程式執行的延遲,相比來說。在某些條件下選擇非同步方法呼叫調用就可能更好一些。
舉個例子:(引用別人的例子http://zhidao.baidu.com/question/97924815.html)
Socket傳輸中拿TCP傳輸為例。假設伺服器A客戶機B進行通訊傳輸。首先需要在A機建立監聽線程。監聽某一連接埠,那麼B機可以向A機發送通訊請求,B機串連到A機以後。A機可以從他的監聽隊列中取的一個監聽對象。在A端拿到了這個Socket對象就可以進行接收跟發送資料了。這裡問題就出現了。假如B端在請求A端的時候請求成功就發送一條資料。那麼
A端就可以直接拿Socket對象得到他的資訊。但是假如B端並沒有在串連成功後直接發送資訊而是在後來不確定的時間這內發送的資訊。那麼A端就無法得到這條資訊。通常的做法是用一個定時器去不短的掃描這個資料緩衝區。看是不是有資料存在這樣效率非常低下。那麼如何解決這個問題呢。就用到了我們的非同步傳輸。非同步傳輸的原理是。在A端得到這個SOCKET對象以後並不是直接去接收資料而是建立一個回呼函數。回呼函數是由系統維護的。他在指定的時間自動去掃描資料存放區區。假如有資料他就把資料存放區到指定的位元組數組中。不用使用者自己去關心。
三.Socket編程常用方法
這裡主要介紹幾種常用的通訊端編程方法:
1.構造方法
構造一個新的通訊端對象,該方法調用時前面須添加new,傳回值為通訊端對象執行個體.
public Socket(
AddressFamilyaddressFamily, //網路類型
SocketTypesocketType, //通訊端類型
ProtocolTypeprotocolType); //使用的協議
)
2.Bind()方法
綁定特殊連接埠用於監聽
public void Bind(EndPoint loadEP) //本地主機,如IPEndPoint對象
3.Listen()方法
該方法用於監聽連接埠
public void Listen(int bcaklog) //最大可處理的串連數
4.Accept()方法
該方法用於決定通訊端的狀態,用於建立一個通訊端處理建立的串連
public Socket Accept() //傳回值為新的通訊端對象執行個體
5.BeginAccpet()和EndAccept()方法
該方法用於非同步處理串連請求,與Accept()方法區別是Accept()立即處理串連請求,它是非同步處理.
public IAsyncResult BeginAccept(
AsyncCallBack callback, //非同步回調
objecet state //自訂對象
)
EndAccpet()用於結束一個處理非同步串連請求和BeginAccept()方法配合使用.
public socket EndAccept(IAsynResult asyncResult) //為處理的通訊端請求,即BeginAccept()方法的請求.
由於作者還在學習當中,還有很多方法,下面只提供方法名,具體的方法參數自己再去尋找.
Connect()、BeginConnect()\EndConnect()、Close()、send()、BeginSend()\EndSend()、SendTo()、BeginSendTo()\EndSendTo()、Receive()、BeginReceive()\EndReceive()、ReceiveFrom()、GetSocketOption()等方法.
四.總結
上面的敘述就是我最近學習的C#網路編程關於通訊端的一些基礎知識的理解,其中主要的內容是根據閱讀的書。同時參考了一些網上資料及自己學過的網路知識和作業系統知識,這篇總結對我以後的網路編程的學習很有幫組,希望也能幫組大家。同時如果有錯誤或不足之處,希望大家原諒!最後感謝我看的周存傑同志編寫《C#網路編程執行個體教程》書籍。
(BY:Eastmount 2013-7-13-夜10點)