1.套接口地址结构

1.1 IPv4 套接口地址结构

       #include <netinet/in.h>

       struct  in_addr

       {

          in_addr_t     s_addr ;                 //32位的IPv4地址,按网络字节序

       };

     

       struct sockaddr_in

       {

          uint8_t             sin_len ;      //结构体的长度 16

          sa_family           sin_family ;   //AF_INET

          in_port_t           sin_port ;     //16位的TCP或者UDP端口号,

                          网络字节序

          struct  in_addr     sin_addr ;     //32位的IPv4地址,按网络字节序

          char                sin_zero[8]    //未分配

       };

       

1: POSIX 规范只需要struct sockaddr_in 结构中的3个成员: sin_family  , sin_port  , sin_addr

2: POSIX定义的数据类型  :

                      #include <sys/types.h>

                int8_t                             带符号的8位整数

                uint8_t                            无符号的8位整数

                int16_t                            带符号的16位整数

                uint16_t                           无符号的16位整数

                int32_t                            带符号的32位整数

                uint32_t                           无符号的32位整数

                      #include <sys/socket.h>

                sa_family_t                 套接口地址结构的地址族  : AF_XXX

                socklen_t                   套接口地址结构的长度,一般为uint32_t

                      #include <netinet/in.h>

                in_addr_t                          IPv4地址,一般为uint32_t

                in_port_t                          TCPUDP端口,一般为uint16_t

 

 

1.2 通 用套接口地址结构

       #include <sys/socket.h>

       struct sockaddr

       {

          uint8_t               sa_len;

          sa_family_t           sa_family

          char                  sa_data[4];

       };

 

: 通用套接口的由来---当作为参数传递给任何一个套接口函数时,套接口地址结构总是通过指针来传递,但通过指针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址。

 ANSI C中有很简单的办法(通用指针类型void * ,但是,套接口函数在ANSI C之前定义,1982年采用了如上的定义。

  于是,套接口函数被定义为采用指向通用套接口地址结构的指针

     int bind( int,  struct sockaddr *,  socklen_t ) ;

 

通用套接口地址结构的唯一用途是给指向特定于协议的地址结构的指针转换类型。

 

1.3 IPv6 套接口地址结构

    #include <netinet/in.h>

    struct in6_addr

    {

        uint8_t    s6_addr[16];            //128IPv6地址,网络字节序

    };

 

    struct sockaddr_in6

    {

        uint8_t             sin6_len;        //结构体的长度 28

        sa_family_t         sin6_family;     //AF_INET6

        in_port_t           sin6_port;       //传输层端口,网络字节序

        uint32_t            sin6_flowinfo;  //flow information ,未定义

        struct in6_addr     sin6_addr;      //IPv6地址,网络字节序

        uint32_t            sin6_scope_id;   //接口

         }

 

1.4 新的通用套接口地址结构

    作为IPv6套接口API一部分而定义,相比struct sockaddr,新的struct sockaddr_storage足以容纳系统所支持的任何套接口地址结构。

    #include <netinet/in.h>

    struct sockaddr_storage

    {

        uint8_t         ss_len;

        sa_family_t     ss_family

 

       

    };

 

1.5 各套接口地址结构比较

 

 

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值