UNIX网络编程笔记——Socket Address Structure

Socket Address Structure——头文件<netinet/in.h>

IPv4 Socket Address Structure

View Code
/*  IPv4 Socket Address Structure  */
typedef  uint32_t  in_addr_t;
typedef  uint16_t  in_port_t;
typedef  unsigned short  sa_family_t;

struct  in_addr{
   in_addr_t  s_addr;    /* 32-bit IPv4 address */
                                /* network byte ordered */    
};
struct  sockaddr_in {
   uint8_t        sin_len;
   sa_family_t      sin_family;
   in_port_t      sin_port;
   struct  in_addr      sin_addr;
   char          sin_zero[8];
};

IPv6 Socket Address Structure

View Code
/*  IPv6 Socket Address Structure  */
typedef  uint16_t  in_port_t;
typedef  unsigned short  sa_family_t;

struct  in6_addr{
   uint8_t    s6_addr[16];
};
struct  sockaddr_in6{
   uint8_t        sin6_len;
   sa_family_t      sin6_family;
   in_port_t      sin6_port;
   uint32_t      sin6_flowinfo;
   struct  in6_addr sin6_addr;
};

Comparison of Socket Structure:

Generic Socket Address Structre——<sys/socket.h>

由于套接字函数需接收来自不同协议的地址结构,ANSI的办法是使用通用的指针类型,即(void *),但套接字函数先于ANSI之前定义,其方法是:在<sys/soket.h>定义一个通用的套接字地址结构。
struct  sockaddr{
   uint8_t        sa_len;
   sa_family_t      sa_family;
   char          sa_data[14];
};

对于这些函数的任何调用都必须将指向特定于协议的套接口地址结构的指针类型转换成指向通用套接口地址结构的指针,例如:

struct sockaddr_in serv;    /* IPv4 socket address structure */
/* fill in serv{} */
bind(sockfd, (struct sockaddr *)&serv, sizeof(serv));

New Generic  Address Structre——<netinet/in.h>

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

struct sockaddr_storage{
    uinet8_t        ss_len;       /* implementation depentdent */
    sa_family_t    ss_family;  /* address family: AR_xxx value */

};

除了 ss_family 和 ss_len 外, sockaddr_storage 结构中的字段(如果有的话)对用户是透明的。sockaddr_storage 必须类型强制转换或拷贝到适合于ss_family字段所给出地址类型的套接口地址结构中,才能访问其他字段。

 

posted @ 2013-04-11 09:24  jeccey  阅读(419)  评论(0编辑  收藏  举报