套接口地址结构

来源:互联网 发布:万能快捷回复软件 编辑:程序博客网 时间:2024/04/30 06:25

套接口地址结构         
        大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议都定义他自己的套接口地址结构,以“sokcaddr_”开头,并以对应其协议族的唯一后缀结束。


IPv4套接口地址



以“sockaddr_in”命名,定义在<netinet/in.h>头文件中
struct in_addr
{
in_addr_t s_addr; //32bit IP address
};
struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_fimily; //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
char sin_zero[8];
};
sa_family_t:套接口地址结构地址族
socklen_t:套接口地址结构长度,为uint32_t
in_addr_t:IPv4地址,一般为uint32_t
in_port_t:端口,一般为uint16_t


IPv4两种使用方法:serv.sin_addr表示的是struct in_addr结构;而serv.sin_addr.in_addr

表示的是一个uint32整数。


当作为参数传递给任一个套接口函数时,套接口地址结构是通过指针传递的。但是通过指针来取得此参数的函数必须处理来自所支持的任何协议族的套接口地址结构。所以在<sys/socket.h>中定义一个通用地址接口:
struct sockaddr
{
uint8_t sa_len;
sa_fanily_t sa_family;
char sa_data[14];
};


IPv6套接口地址结构



以“sockaddr_in6”命名,定义在<netinet/in.h>头文件中
struct in6_addr
{
uint8_t s6_addr[16]; //128-bit IPv6 address
};

#define SIN6_LEN //如果系统支持结构中的长度成员,则必须定义SIN6_LEN

struct sockaddr_in6
{
uint8_t sin6_len;
sa_family_t sin6_fimily; //AF_INET6
in_port_t sin6_port;   //16-bit TCP or UDP port number
 //Network Byte Ordered
uint32_t sin6_flowinfo; //priority & flow lable

struct in6_addr sin6_addr; // IPv6 address
//Network byte ordered
};

地址转换换书在地址的文本表达和套接口地址结构中的二进制值之间进行转换。
IPv4使用:inet_addr和inet_ntoa 
IPv4和IPv6都可使用:inet_pton和inet_ntop

















        
原创粉丝点击