C#託管Socket的實現方法(1)

Socket就是套接字,它是網絡編程中最常用遇到的概念和工具。在TCP/IP網絡中,傳送和接收數據就會經常使用到Socket,由於使用 Socket能夠在網絡上處理複雜數據,所以在各種網絡應用程序中,涉及到數據傳送和接收,一般都會使用Socket,可見要掌握網絡編程,精通 Socket是非常重要。由於Socket本身的複雜性,決定了掌握它是比較困難的。Visual C#是微軟公司推薦的開發.Net平臺應用程序的主要語言,隨着.Net的深入人心,目前很多有遠見的公司都把以前的軟件轉向了.Net平臺。掌握網絡編 程始終是學習一種開發語言的重點,這一點對於Visual C#也同樣如此。Visual C#實現網絡功能其關鍵也是掌握託管Socket的使用方法。本文就來詳細介紹Visual C#中利用託管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實現客戶機程序的具體方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章