1. 程式人生 > >socket程式設計 套接字程式設計 (純理論,以後補一下實現程式碼)

socket程式設計 套接字程式設計 (純理論,以後補一下實現程式碼)

基本概念

 

套接字——應用層和傳輸層之間,提供應用傳輸介面

Web/RPC/中介軟體——應用層之上的網路開發

應用程式設計介面API(application programming interface)

套接字介面(socket interface)簡稱套接字,是一種API。

 

socket API

一個程序可能會建立多個套接字,不同的程序會建立自己的套接字。

當客戶端建立套接字希望與服務端進行通訊時,通過埠號來分辨與服務端的哪一個應用程序進行通訊(為什麼不通過IP地址進行分辨,因為服務端主機上有多個應用程序在執行,每個應用程序可能會使用多個套接字。單單通過IP地址不足以分辨出是與哪一個套接字進行通訊)

 

套接字對內對外使用的管理機制不同

標識通訊端點(對外)——IP地址+埠號——這是針對TCP/IP的

作業系統/程序如何管理套接字(對內)——套接字描述符(socket  description)

一個程序建立一個套接字的時候,會返回一個套接字描述符。作業系統在管理內部套接字的時候,都是通過套接字描述符來引用的(作業系統使用套接字描述符來管理套接字的時候, 就是一種套接字抽象機制,這種抽象機制類似於檔案的抽象。Unix作業系統對於套接字管理和檔案管理,是一個管理,也就是說他把套接字看成是一個特殊的檔案;Windows作業系統是分開管理的。)。

 

 

socket API函式

1、socket函式——建立套接字

呼叫socket函式成功之後,會返回一個套接字描述符(sd)

socket函式的三個引數:

1)、Protofamily)(協議族)——用於說明我的套接字面向哪種協議

2)、tyep(套接字型別)

3)、proto(協議號)

值為0代表用的是預設協議

例子——建立流套接字程式碼段

 

2、closesocket函式——關閉連線(Unix中的函式名是close,沒有socket,記住)

 

3、bind函式——為套接字設定本地端點地址資訊(即IP地址+埠號)

熟知埠號——web伺服器就是80,sftp是25,以此類推

客戶端一般不必呼叫bind函式

如果伺服器有多個網絡卡,也就是有多個IP地址,該如何處理,繫結哪一個IP地址呢——使用地址IP體制萬用字元 INADDR_ANY

 

4、listen函式——服務端監聽狀態

 

5、connect函式——客戶端

 

6、accept函式

當伺服器呼叫accept,取走客戶端的連線請求之後,就會建立新的套接字。真正與客戶端建立連線的,就是這個新套接字。

 

7、send,sendto函式——用於傳送資料

 

8、recv、recvfrom函式——用於接受資料

 

9、setsockopt、getsockopt——套接字引數設定和套接字引數讀取

 

 

套接字面向TCP/IP可以建立的服務型別

應用層要通訊,就要建立套接字。套接字假期了應用層和傳輸層的一個介面。

如果我建立的套接字的面向TCP的,就是流式套接字;如果是面向UDP而建立的套接字,就是資料報套接字;如果是直接面向網路層的套接字,則是原始套接字

 

 

網路應用中Socket API(TCP)呼叫的基本流程

 

 

客戶端軟體的設計

1、解析各個功能函式

    

    

 

2、TCP客戶端軟體流程

   

 

3、UDP客戶端軟體流程