套接字地址结构

2014-06-06 23:37:36   最后更新: 2015-01-17 18:26:03   访问数量:1030




IPv4 套接字地址结构通常也称为“网际套接字地址结构”,以 sockaddr_in 命名,定义在 <netinet/in.h> 头文件中:

struct in_addr { in_addr_t s_addr;    /* 32-bit IPv4 address, network byte ordered*/ };

 

struct sockaddr_in { char              sin_zero[8]; /* unused */ uint8_t           sin_len; /* length of structure */ sa_family_t       sin_famliy; /* AF_INET */ in_port_t         sin_port; /* 16-bit TCP or UDP port number, network byte ordered */ struct in_addr    sin_addr; /* 32-bit IPv4 address, network byte ordered */ }

 

需要注意的是,sin_len 并不是 POSIX 规范中规定的,并不是所有厂家都支持套接字地址结构的长度字段,但是正因为有了长度字段才简化了长度可变套接字地址结构的处理

对于上面的类型,int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t 分别表示制定位数的有、无符号整数类型,都定义于 <sys/types.h> 中

sa_family_t 是套接字地址结构的地址族,socklen_t 是套接字地址结构的长度(一般为uint32_t),这两个类型定义于 <sys/socket.h> 中

in_addr_t 是IPv4地址(一般为uint32_t),in_port_t 是 TCP 或 UDP 的端口(一般为uint16_t),这两个类型定义于 <netinet/in.h> 中

需要注意的是,虽然套接字地址结构中的某些字段(如 IP 地址和端口号)用在不同主机之间的通信中,但是结构本身并不在主机之间传递

作为处理这些地址结构的函数常常要支持各种协议族,为了让他们能够支持任何协议族的套接字地址结构,在 <sys/socket.h> 中定义了一个通用的套接字地址结构

struct sockaddr {     char           sa_data[14];    /* protocol-specific address */     uint8_t        sa_len;     sa_family_t    sa_family;      /* address family: AF_XXX value */ }

 

因此,当我们在使用这些函数时,必须要将指向特定协议的套接字地址结构的指针进行强制类型转换,编程指向某个通用套接字的指针

struct in6_addr {      uint8_t  s6_addr[16];          /* 128-bit IPv6 address, network byte ordered */ };                #define SIN6_LEN      /* required for compile-time tests */                struct sockaddr_in6  {      uint8_t         sin6_len;      /* length of this struct (28) */     sa_family_t     sin6_family;   /* AF_INET6 */     in_port_t       sin6_port;     /* transport layer port#, network byte ordered */     uint32_t        sin6_flowinfo; /* flow information, undefined */     struct in6_addr sin6_addr;     /* IPv6 address, network byte ordered */     uint32_t        sin6_scope_id; /* set of interfaces for a scope */ };

 

IPv6 的地址族是 AF_INET6,而 IPv4 的地址族是 AF_INET

作为 IPv6 套接字 API 的一部分而定义的新的通用套接字地址结构克服了现有 struct sockaddr 的一些缺点,新的通用地址结构足以容纳系统所支持的任何套接字地址结构,sockaddr_storage 结构定义在 <netinet/in.h> 头文件中

struct sockaddr_storage  {    uint8_t      ss_len;       /* length of this struct (implementationdependent) */   sa_family_t  ss_family;    /* address family: AF_xxx value */   /* implementation-dependent elements to provide:     * a) alignment sufficient to fulfill the alignment requirements of     *    all socket address types that the system supports.     * b) enough storage to hold any type of socket address that the     *    system supports.     */ };

 

 

 






技术帖      linux      unix      ip      计算机网络      unp      unix网络编程      socket      龙潭书斋      结构体      套接字     


京ICP备15018585号