Visual C#託管Socket的實現方法

iDotNetSpace發表於2010-03-17
Socket就是套接字,它是網路程式設計中最常用遇到的概念和工具。在TCP/IP網路中,傳送和接收資料就會經常使用到Socket,由於使用Socket能夠在網路上處理複雜資料,所以在各種網路應用程式中,涉及到資料傳送和接收,一般都會使用Socket,可見要掌握網路程式設計,精通Socket是非常重要。

一.簡介Socket:

Socket誕生於上個世紀80年代初,美國政府的高階研究工程機構(ARPA)給加利福尼亞大學伯克力(Berkeley)分校提供了資金,委託他們在UNIX作業系統下實現TCP/IP協議的開發介面。於是研發人員就為TCP/IP網路通訊開發了一個API(應用程式介面)。這個API稱為Socket介面(套接字)。所以有時候說,Socket是TCP/IP上的API。

到了上個世紀90年代,當時的一些網路開發商,包括現在地Sun和Microsoft公司等,共同制定了一套WINDOWS下的網路程式設計介面,即WindowsSockets規範,簡稱WinSock規範。WinSock規範是一套開放的、支援多種協議的Windows下的網路程式設計介面。從1991年的1.0版到1995年的2.0.8版,經過不斷完善並在Intel、Microsoft、Sun等公司的大力支援下,已成為Windows網路程式設計的事實上的標準。目前,WinSock規範主要有1.1版和2.0版。兩者的最重要區別是1.1版只支援TCP/IP協議,而2.0版可以支援多協議。2.0版有良好的向後相容性,任何使用1.1版的原始碼,二進位制檔案,應用程式都可以不加修改地在2.0規範下使用。

可見Socket介面其實是TCP/IP網路的API介面函式,Socket資料傳輸其實就是一種特殊的I/O。常用的Socket型別有兩種:流式Socket(SOCK_STREAM)和資料包式Socket(SOCK_DGRAM)。流式是一種面向連線的Socket,針對於面向連線的TCP服務應用;資料包式Socket是一種無連線的Socket,對應於無連線的UDP服務應用。

二.Visual C#中操作Socket:

雖然Visual C#可以使用NetworkStream來傳送、接收資料,但NetworkStream在使用中有很大的侷限性,利用NetworkStream只能傳送和接收字元型別的資料,如果要傳送的是一些複雜的資料如:二進位制資料等,它就顯得能力有限了。但使用NetworkStream在處理自身可運算元據時,的確要比Socket方便許多。Socket(套接字)幾乎可以處理任何在網路中需要傳輸的資料型別。

我們知道Visual C#和Visual C++的區別之一,就是Visual C#沒有屬於自己的類庫,而Visual C++卻是有的,Visual C#使用的類庫是.Net框架為所有開發.Net平臺程式語言提供的一個公用的類庫——.Net FrameWork SDK。Visual C#主要網路功能主要使用.Net FrameWork SDK中的提供的二個名稱空間“System.Net.Sockets”和“System.Net”。而實現Socket使用的是名稱空間“System.Net.Sockets”中的Socket類。Visual C#通過建立Socket類的例項來實現Socket的託管版本。在Visual C#中建立完Socket例項後,可以通過此Socket例項的Bind方法繫結到網路中指定的終結點,也可以通過其Connect方法向指定的終結點建立的連線。連線建立完畢,就可以使用其Send或SendTo方法將資料傳送到Socket;同樣使用其的Receive或ReceiveFrom方法從Socket中讀取資料。在Socket使用完畢後,請使用其的Shutdown方法禁用Socket,並使用Close方法關閉Socket。表01和表02是Socket類中的常用屬性和方法及其簡要說明。

屬性 說明
AddressFamily 獲取Socket的地址族。
Available 獲取已經從網路接收且可供讀取的資料量。
Blocking 獲取或設定一個值,該值指示Socket是否處於阻塞模式。
Connected 獲取一個值,該值指示Socket是否已連線到遠端資源。
Handle 獲取Socket的作業系統控制程式碼。
LocalEndPoint 獲取本地終結點。
ProtocolType 獲取Socket的協議型別。
RemoteEndPoint 獲取遠端終結點。
SocketType 獲取Socket的型別。

表01:Socket類的常用屬性及其說明

方法 說明
Accept 建立新的Socket以處理傳入的連線請求。
BeginAccept 開始一個非同步請求,以建立新的Socket來接受傳入的連線請求。
BeginConnect 開始對網路裝置連線的非同步請求。
BeginReceive 開始從連線的Socket中非同步接收資料。
BeginReceiveFrom 開始從指定網路裝置中非同步接收資料。
BeginSend 將資料非同步傳送到連線的
BeginSendTo 向特定遠端主機非同步傳送資料。
Bind 使Socket與一個本地終結點相關聯。
Close 強制Socket連線關閉。
Connect 建立到遠端裝置的連線。
EndAccept 結束非同步請求以建立新的Socket來接受傳入的連線請求
EndConnect 結束掛起的非同步連線請求。
EndReceive 結束掛起的非同步讀取。
EndReceiveFrom 結束掛起的、從特定終結點進行非同步讀取。
EndSend 結束掛起的非同步傳送
EndSendTo 結束掛起的、向指定位置進行的非同步傳送。
GetSocketOption 返回Socket選項的值。
IOControl 為Socket設定低階別操作模式
Listen 將Socket置於偵聽狀態。
Poll
Receive 接收來自連線Socket的資料。
ReceiveFrom 接收資料文報並儲存源終結點。
Select 確定一個或多個套接字的狀態。
Send 將資料傳送到連線的
SendTo 將資料傳送到特定終結點。
SetSocketOption 設定Socket選項。
Shutdown 禁用某Socket上的傳送和接收。


表02:Socket類的常用方法及其說明

其中“BeginAccept”和“EndAccept”、“BeginConnect”和“EndConnect”、

“BeginReceive”和“EndReceive”、“BeginReceiveFrom”和“EndReceiveFrom”、

“BeginSend”和“EndSend”、“BeginSendTo”和“EndSendTo”是六組非同步方法,

其功能分別相當於“Accept”、“Connect”、“Receive”、“ReceiveFrom”、

“Send”和“SendTo”方法。

下面就通過一個具體的示例,來介紹Visual C#中如何通過託管Socket實現資料傳送和接收的具體方法。

本文示例其實是由二部分組成,也可以看成是客戶機程式和伺服器程式。客戶機程式功能是通過

Socket向伺服器程式建立連線,並在連線完成後,向伺服器傳送資料;伺服器程式通過偵聽埠,接受網路的Socket的連線請求,並在連線完成後,接收從客戶機傳送來的資料,並顯示出來。下面首先來介紹Visual C#通過託管Socket實現客戶機程式的具體方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-629683/,如需轉載,請註明出處,否則將追究法律責任。

相關文章