何謂Socket ?

 

從網路的角度來看,socket就是通訊連結的端點,從程式設計者的角度來看,socket提供了一個良好的介面,使User不需要知道下一層的網路協定運作的系結,便可以寫網路通訊程式。

 

UserAP 只要連結到Socket 便可以和網路上任何一個通訊端點連線,Socket之間的通訊,就像作業系統裡面的程序( Process )之間的通訊一樣。

 

而兩個程序之間的通訊方法,Socket採用的是一種識別碼,AP可以用這個識別唯一識別通信端點。

 

Socket 可以翻譯為 [ 插座 ] [ 傳收口 ],它是BSD4.2版所提供的一種特殊型態的檔案,它的作用其實蠻類似管線的 ( Pipe ) ,它提供了處理程序之間的通訊 (interprocess communication )的能力,並且支援網路的功能,User可以用”Socket”system呼叫 (system call)來建立它,然後return的是一個檔案描述符( File descriptor )

 

 

Sockets 的分類

 

Socket 主要分為兩種類型 :

  1. Datagram sockets (connectionless) :
  2. Datagram socket間是利用UDP封包傳送,因此接收端socket 可能會收到次序錯誤的資料,並且部分資料也有可能遺失。
  3.  
  4. Stream sockets (connection-oriented) :
  5. Stream sockets間是利用TCP封包來傳送的,因此接收端Socket可以收到順序無誤、無重複,並且正確的資料,而此次專案也是使用這種方式來傳遞資料,好處是比上面那種方式可靠,而且照順序來,缺少誰都知道。此外,TCP傳送的時候是採資料流的方式,所以傳送的時候,所有的資料會被視情況分割在數個TCP封包中。 (所以在制定封包格式的時候,就很重要了)

 

 

 

 

 

 

主從式架構模型 ( Client / Server model )

 

每個網路程式都有一個通訊端點,一種端點是Client,一種是ServerClient會送出第一個封包,由一個Server接收,之後,ServerClient就能開始愉快的聊天(收送資料)了。

 

在聊天之前,有個規則必須兩方都得遵守,那就是兩方的Socket必須要是同一種類型的,要嘛是TCP ( Stream socket ) ,要嘛是UDP ( datagram socket ) ,你想麻,兩個人總要有共通語言才能抬槓聊天啊

 

 

TCP/IP 為例 :

一個Socket name 包括了IP address 、連接阜編號,以及協定本身,Client可以用Windows socket的名稱伺服函式來查到標準Server的連接阜編號,而如果知道Server 的主機名稱,則可以用Windows Socket的主機名稱分析函式來查得Server IP,當Client Socket成功Connect ServerSocket 後,兩者便行成了結合”(association),在此時,每個Socket都可以由它的名字所形成的組合加以識別。

 

結合5要素 :

  1. 所用的協定
  2. 用戶端IP位址
  3. Client 連結阜號碼
  4. Server IP 位址
  5. Server 連結阜號碼

 

 

 

 

 

 

 

 

 

 

使用Socket的方式 :

 

所有網路應用程式皆可以分為5個步驟 :

  1. Create Socket
  2. Socket 命名
  3. 與另外一個Socket結合
  4. sockets間收送資料
  5. 關閉socket

 

開啟一個Socket

 

Socket是通訊的端點,就像電腦的網卡一樣,使得網路應用程式可以像介面卡在主機板一樣,插入網路中。一般來說,一台PC只有一張網卡,但是你可以有許多sockets,而且也可以同時使用同一片的網卡,ClientServer都需要一個Socket以存取網路資料,使用socket()函式呼叫就可以開啟一個socket

 

 

Socket命名

 

Server端的程式必須為它的Socket命名,這樣client端才能找到病正確地辨認出它的socket,如果Server沒有替它的Socket命名,則協定堆疊會拒絕Client要通訊的請求。而要幫socket命名需要三個參數 ( 協定、連結阜號碼、位址 ) ,而Client端就要用這些值來和Server建立連結。要為Socket命名,Server必須為socket位址結構設初始值,並且呼叫bind()函式,以指定本身連結阜號碼和IP位址完成命名的工作。

 

 

與另外一個Socket結合

 

假設我們Client端和Server端都開啟了一個socket,並且名也命好了,接下來四服器就要準備接收封包了,而Client則是要準備發送封包 ( 記得我們上面講過的,Client要先發出第一砲才可以 ),當準備工作完成的時候,此兩端的sockets就叫做建立一個 結合”(association)如何為結合此兩端的socket做準備呢?WinSock API中提供了幾個函式來完成此動作。在伺服器端則以呼叫listen()來準備接受用戶端送來的連結要求,如果收到連線要求,則開啟另一個新的socket來和用戶端進行連線(使用accept()函式);而在用戶端則是呼叫connect()函式與伺服器端的socket完成結合。

 

 

Socket間收送資料

 

這部分就簡單了,有連結的用recv() send () ,無連結的用recvfrom()sendto()

 

 

關閉Socket

 

當用戶端完成收送資料且往後並不會在使用時,必須關閉socket,對TCP socket而言,關閉socket除了將socket的資源還給協定堆疊,此外並嘗試將以建立的連結關閉。但對UDP socket而言,則是單純地將資源還給協定堆疊。關閉socket可呼叫closesocket()來完成。

arrow
arrow
    文章標籤
    socket
    全站熱搜

    Eric 發表在 痞客邦 留言(0) 人氣()