何謂Socket ?
從網路的角度來看,socket就是通訊連結的端點,從程式設計者的角度來看,socket提供了一個良好的介面,使User不需要知道下一層的網路協定運作的系結,便可以寫網路通訊程式。
User或AP 只要連結到Socket 便可以和網路上任何一個通訊端點連線,Socket之間的通訊,就像作業系統裡面的程序( Process )之間的通訊一樣。
而兩個程序之間的通訊方法,Socket採用的是一種識別碼,AP可以用這個識別唯一識別通信端點。
Socket 可以翻譯為 [ 插座 ] 或 [ 傳收口 ],它是BSD4.2版所提供的一種特殊型態的檔案,它的作用其實蠻類似管線的 ( Pipe ) ,它提供了處理程序之間的通訊 (interprocess communication )的能力,並且支援網路的功能,User可以用”Socket”system呼叫 (system call)來建立它,然後return的是一個檔案描述符( File descriptor )。
Sockets 的分類
Socket 主要分為兩種類型 :
- Datagram sockets (connectionless) :
- Datagram socket間是利用UDP封包傳送,因此接收端socket 可能會收到次序錯誤的資料,並且部分資料也有可能遺失。
- Stream sockets (connection-oriented) :
- Stream sockets間是利用TCP封包來傳送的,因此接收端Socket可以收到順序無誤、無重複,並且正確的資料,而此次專案也是使用這種方式來傳遞資料,好處是比上面那種方式可靠,而且照順序來,缺少誰都知道。此外,TCP傳送的時候是採資料流的方式,所以傳送的時候,所有的資料會被視情況分割在數個TCP封包中。 (所以在制定封包格式的時候,就很重要了)。
主從式架構模型 ( Client / Server model )
每個網路程式都有一個通訊端點,一種端點是Client,一種是Server,Client會送出第一個封包,由一個Server接收,之後,Server和Client就能開始愉快的聊天(收送資料)了。
在聊天之前,有個規則必須兩方都得遵守,那就是兩方的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 Server的Socket 後,兩者便行成了”結合”(association),在此時,每個Socket都可以由它的名字所形成的組合加以識別。
結合5要素 :
- 所用的協定
- 用戶端IP位址
- Client 連結阜號碼
- Server IP 位址
- Server 連結阜號碼
使用Socket的方式 :
所有網路應用程式皆可以分為5個步驟 :
- Create Socket
- 為Socket 命名
- 與另外一個Socket結合
- 在sockets間收送資料
- 關閉socket
開啟一個Socket
Socket是通訊的端點,就像電腦的網卡一樣,使得網路應用程式可以像介面卡在主機板一樣,插入網路中。一般來說,一台PC只有一張網卡,但是你可以有許多sockets,而且也可以同時使用同一片的網卡,Client和Server都需要一個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()來完成。
留言列表