socket通用地址类的设计(未完待续)

大纲:

一、常见socket地址结构体集合

二、设计考虑

三、最终的结构总结

四、参考文档列表

 

一、地址集合

1.sockaddr通用地址,Linux网络编程的地址结构体一种,其定义如下:

struct sockaddr{  
	unsignedshort sa_family; /* address family */
	char sa_data[14]; /* up to 14 bytes of direct address */   
}; 


     说明:sa_family:是地址家族,也称作,协议族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET。   

     sa_data:是14字节协议地址。

存在问题:如果是IPv6,则sa_data显然是不够的。

2.IPv4地址

//path:/usr/include/netinet/in.h
typedef uint32_t in_addr_t;
struct in_addr{
    in_addr_t s_addr;
};
struct sockaddr_in {
     short int sin_family; // Address family
     unsigned short int sin_port; // Port number
     struct in_addr sin_addr; // Internet address
     unsigned char sin_zero[8]; // Same size as struct sockaddr
};

 说明:可以把IPv4理解为sockaddr更详细的使用时,可以把sockaddr_in强制转换为sockaddr。

3.IPv6地址

struct in6_addr{
	u_int8_t s6_addr[16]; /* IPv6 address */
}
struct sockaddr_in6 {
          u_char           sin6_len;      /* length of this structure */
          u_char           sin6_family;   /* AF_INET6                 */
          u_int16m_t       sin6_port;     /* Transport layer port #   */
          u_int32m_t       sin6_flowinfo; /* IPv6 flow information    */
          struct in6_addr  sin6_addr;     /* IPv6 address             */
};

4.通用地址存储器

//path: /usr/include/linux/socket.h
#define sockaddr_storage __kernel_sockaddr_storage
#define _K_SS_MAXSIZE   128     /* Implementation specific max size */

struct __kernel_sockaddr_storage {
        unsigned short  ss_family;              /* address family */
        /* Following field(s) are implementation specific */
        char            __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
                                /* space to achieve desired size, */
                                /* _SS_MAXSIZE value minus size of ss_family */
} __attribute__ ((aligned(_K_SS_ALIGNSIZE)));   /* force desired alignment */


总结     

1> 通用部分为协议族和地址

2>

参考:

[1] http://uw714doc.sco.com/en/SDK_netapi/sockC.TheIPv6sockaddrstructure.html

 

 


 

 

 

 

 

 

你可能感兴趣的:(socket通用地址类的设计(未完待续))