UNIX網絡編程學習筆記1 套接字地址結構

噗,開始啃這本書時才發現,基礎不夠的感受真是不爽。由於這章看着想睡覺,因此只是粗略的看了一下,沒想到後面幾章離不開這個, 每次看到新的知識點都要回來翻一翻,因而打算總結一下0.0socket

全部涉及到的數據類型對照這個表看函數

套接字地址結構的名字均以sockaddr_開頭,並以對應每一個協議族的惟一後綴結尾。ui

例如:網際(IPV4)套接字地址結構 -> sockaddr_inspa

                

 1 struct sockaddr_in{
 2     uint8_t    sin_len;              //長度字段
 3     sa_family_t    sin_family;          //協議族 這裏只能是AF_INET (IPV4) 
 4     in_port_t    sin_port;            //端口 必須是一個至少16位的無符號整數類型
 5     struct in_addr    sin_addr;          //in_addr這個結構只有一個成員 wtf, 包括此行向上數共3行的3個字段是POSIX須要的  固然定義額外的也無妨。
 6     char sin_zero[8]                //未使用 老是置0(弄這幹啥 逗我?)
 7 };
 8 
 9 struct in_addr{                   //因特網地址結構
10     in_addr_t    s_addr;              //必須爲一個至少32位的整數類型 IPV4地址
11 
12 };

 

 

   IPV6套接字地址結構 -> sockaddr_in6指針

 1 struct int6_addr{       
 2     unit8_t    s6_addr[16];      //16 * 8 = 128位的IPV6地址    <- 別人舉的栗子   分紅8段 冒號分隔
 3 
 4 };
 5 #define SIN6_LEN            //若是系統支持套接字地址結構中的長度字段,那麼此處必定要定義!
 6 
 7 struct sockaddr_in6{
 8     uint8_t        sin6_len;     //長度字段
 9     sa_family_t    sin6_family;   //AF_INET6
10     in_port_t      sin6_port;    //類型同IPV4
11     uiint32_t      sin6_flowinfo;  //高序12位保留,低序20位是流標(WHAT?)
12     struct in6_addr    sin6_addr;  //一樣爲一個結構
13     uint32_t       sin6_scope_id;  //對於具有範圍的地址(scoped address),sin6_scope_id字段標識其範圍(scope),最多見的是鏈路局部地址(link-local address)的接口索引(interface index)(並不知道是什麼鬼0.0) 14 };

 

  通用套接字地址結構 -> sockaddrcode

套接字函數是在有ANSI C 以前定義的,而那時沒有void *指針(2333) 然而套接字函數須要處理來自所支持的任何協議族的套接字地址結構(引用形式傳遞(arrow))  因此在1982年採起的辦法是在<sys/socket.h>中定義一個通用套接字地址結構blog

struct sockaddr{
    uint8_t            sa_len;
    sa_family_t      sa_family;
    char                sa_data[14];
};

因而套接字函數被定義爲以指向某個通用套接字地址結構的一個指針做爲其參數之一  例如:int bind(int, struct sockaddr *, socklen_t);索引

這就要求對這些函數的任何調用都必需要將指向特定於協議的套接字地址結構的指針進行強制類型轉換, 變成指向某個通用套接字地址結構的指針,例如:struct sockaddr_in serv; bind(sockfd, (struct sockaddr *) &serv, sizeof(serv))接口

 

 新的通用套接字地址結構 -> sockaddr_storage博客

 1 struct sockaddr_storage{
 2     uint8_t        ss_len;
 3     sa_family_t  ss_family
 4 /***************************
 5 透明
 6 
 7 
 8 
 9 
10 ***************************/
11 };

跟舊的比兩個區別 1:若是系統支持的任何套接字地址結構有對齊須要,這個新結構能知足最苛刻的對齊要求。

         2:sockaddr_storage足夠大,可以容納系統支持的任何套接字地址結構。(除了前兩個字段,其餘全部字段對用戶透明,強制轉換成適合的套接字地址結構才能訪問)

 

接下來看看各類套接字結構的比較(直接上圖2333)

sorkaddr_un結構自己並不是長度可變, 因此咱們得當心處理套接字地址結構自己的長度字段,以及做爲參數傳給內核或從內核返回的長度。

 

2333333~~~~~到此爲止辣  O(∩_∩)O~~   開心  第一篇博客    

容吾在此裝一逼:書山有路勤爲徑,學海無涯苦做舟!

你們一塊兒努力辣~\(≧▽≦)/~啦啦啦。。。。。

相關文章
相關標籤/搜索