int socket(int domin, int type, int protocol) //Linux下創建套接字函數
SOCKET socket(int af, int type, int protocol) //Windows創建套接字函數
上邊兩個函數均是創建套接字的函數,其實這兩個函數的形參都一樣,這兩個函數唯一不同的地方就在於函數的返回值類型不同。Windows上用SOCKET結構體保存返回值類型(其實可以用int,但爲了以後的擴展性,就用SOCKET把)
這些的形參分別代表什麼呢?
協議族
兩個創建socket函數的第一個形參均爲協議族,那麼都有哪些協議族呢?
名稱 | 協議族 |
---|---|
PF_INET | IPv4互聯網協議族 |
PF_INET6 | IPv6互聯網協議族 |
PF_LOCAL | 本地通信的UNIX協議族 |
PF_PACKET | 底層套接字的協議族 |
PF_IPX | IPX Novell協議族 |
套接字類型
函數中的第二個參數,指的就是套接字類型,套接字類型有一下幾個:
面向連接的套接字(SOCK_STREAM)
面向連接的套接字有以下特點:
1. 傳輸過程中數據不會消失
2. 按序傳輸數據
3. 傳輸的數據不存在數據邊界
面向消息的套接字(SOCK_DGRAM)
特點如下:
1. 強調快讀傳輸而非順序傳輸
2. 傳輸的數據可能丟失也可能損毀
3. 傳輸的數據有數據邊界
4. 限制每次傳輸的數據大小
什麼是數據邊界
收發數據的套接字內部有緩衝(buffer),通過套接字傳輸的數據將保存到此處。因此收到數據並不意味着馬上讀取數據,有可能在緩衝區充滿後一次性取走,也有可能多次讀取。
第三個參數
這個參數決定最終採用的協議,雖然前兩個參數已經設定了協議族和套接字數據傳輸方式,但是同一個協議族中很可能有多個傳輸方式一樣的協議,此時,我們就需要制定協議了,例如:
TCP協議 : IPPROTO_TCP
UDP協議 : IPPROTO_UDP