C# 網絡編程之套接字編程基礎知識
最近閱讀了周存傑編寫的《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類亦支持該兩種基本模式——同步和異步。
同步:對執行網絡操作的函數的調用一隻等到操作完成後才將控製返回給調用程序;
異步:網絡操作的函數調用立即返回。
同步方法調用在程序繼續執行之前需要等待同步方法執行完畢返回結果,異步方法則在被調用之後立即返回以便程序在被調用方法完成其任務的同時執行其它操作。因為同步方法調用會導致程序流程中途等待,所以采用同步方法的情況下往往會導致程序執行的延遲,相比來說。在某些條件下選擇異步方法調用就可能更好一些。
舉個例子:(引用別人的例子https://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點https://blog.csdn.net/eastmount/)
最後更新:2017-04-03 16:48:33