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實現客戶機程式的具體方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-629683/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C# 託管資源和非託管資源C#
- 重學c#系列——c# 託管和非託管資源(三)C#
- 重學c#系列——c# 託管和非託管資源與程式碼相關(四)C#
- 託管C++執行緒鎖實現C++執行緒
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- 託管與非託管的混合程式設計程式設計
- 愛彼迎如何實現聯合房東的共同託管?
- c#實現最簡單的socket通訊C#
- C#使用委託實現函式回撥,方法呼叫攔截C#函式
- 重學c#系列——非託管例項(五)C#
- C# 通過socket實現UDP 通訊C#UDP
- C#如何載入嵌入到資源的非託管dllC#
- C# 託管堆 遭破壞 問題溯源分析C#
- 微信雲託管 WebSocket 實戰:基於模版實現訊息推送Web
- C# 如何實現簡單的Socket通訊(附示例)C#
- 用C#的Raw Socket實現網路封包監視C#
- 使用Visual C#實現斷點續傳C#斷點
- C#網站呼叫C++非託管dll須知C#網站C++
- Serverless實踐-靜態網站託管Server網站
- Signalr自託管最簡實踐SignalR
- C#高效能Socket伺服器SocketAsyncEventArgs的實現(IOCP)C#伺服器
- C# 實現socket通訊程式(伺服器端)C#伺服器
- C#委託的幾種表現方式C#
- 企業郵箱託管服務遷移方法
- 搭建自己的harbor(docker託管)Docker
- 用JScript實現VB.Net,C#的[委託Delegate]: (轉)JSC#
- Visual C#中P2P應用程式的實現C#
- 伺服器託管伺服器
- Oracle 託管檔案Oracle
- 華為開發者 雲託管
- C#中使用Socket實現簡單Web伺服器C#Web伺服器
- SharePoint Framework 在Visual Studio Code中除錯你的託管解決方案Framework除錯
- 博森量化軟體:託管錢包與非託管錢包的區別?
- 伺服器託管是什麼意思,為什麼要託管?伺服器
- Knative Serverless 之道:如何 0 運維、低成本實現應用託管?Server運維
- Git使用教程3:MyEclipse+Egit+GitHub實現程式碼託管 【上】EclipseGithub
- Git使用教程3:MyEclipse+Egit+GitHub實現程式碼託管 【下】EclipseGithub
- C#中的委託,匿名方法和Lambda表示式C#