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字段所给出地址类型的套接口地址结构中,才能访问其他字段。