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客戶端軟體流程