C# 網絡編程之套接字編程基礎知識

      最近閱讀了周存傑編寫的《C#網絡編程實例教程》並閱讀了不少相關方面的資料,同時本身也作了一些套接字編程方面的C#程序,因此根據它的知識總結了最近的套接字編程的一些知識點,方便本身的理解與他人的學習,同時也有一些本身之前學習的計算機網絡、操做系統等相關知識。html

一.   套接字編程的概念編程

      套接字(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

      (補充知識)在網絡編程中常使用的兩種方法,socket類亦支持該兩種基本模式——同步和異步。
      同步:對執行網絡操做的函數的調用一隻等到操做完成後纔將控制返回給調用程序;
      異步:網絡操做的函數調用當即返回。
      同步方法調用在程序繼續執行以前須要等待同步方法執行完畢返回結果,異步方法則在被調用以後當即返回以便程序在被調用方法完成其任務的同時執行其它操做。
由於同步方法調用會致使程序流程中途等待,因此採用同步方法的狀況下每每會致使程序執行的延遲,相比來講。在某些條件下選擇異步方法調用就可能更好一些。
async

      舉個例子:(引用別人的例子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點http://blog.csdn.net/eastmount/