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~~   开心  第一篇博客    

容吾在此装一逼:书山有路勤为径,学海无涯苦做舟!

你们一块儿努力辣~\(≧▽≦)/~啦啦啦。。。。。

相关文章
相关标签/搜索