套接字地址结构

1. 通用套接字地址结构:

1.1 概念:

  1. 套接字有几种类别,都可以放进通用套接字的容器中.
  2. 意即,具体的套接字是在通用套接字的基础上细化.

1.2 结构体如下:

struct sockaddr{
    uint8_t sin_len;
    unsigned short sa_family;
    char sa_data[14];
}; //细节参考IPv4套接字地址结构

2. IPv4套接字地址结构:

2.1 结构体:

struct sockaddr_in{
    uint8_t sin_len; //结构体长度
    sa_family_t sin_family; //协议族
    in_port_t sin_port; //端口号
    struct in_addr sin_addr; //ip地址
    char sin_zero[8]; //填充字节
}; //在头文件<netinet/in.h>中

2.2 解析如下:

uint8_t sin_len:

- 特点: 这个字段不一定实现,POSIX规范中不要求.

- 作用: 用于可变套接字地址结构的处理.

- 使用: 无需设置和检查,除非涉及路由套接字.

- 类型: 在头文件< sys/types.h >

- 实现细节: Berkeley实现中,函数会自动调用sockargs函数,设置len,无需手动设置.


sa_family_t sin_family:

- 作用: 指明套接字类型.

- 使用: 一般为AF_INET即可.

- 类型: 头文件< sys/socket.h >,有长度字段时为8为无符号整数,否则16位..

- 实现细节: 事实上,AFaddress family, PFprotocol family,应该在初始化时用AF,调用socket函数时用PF;;;然而实际都被宏定义成0.(不同系统实现不同)


in_port_t;

- 使用: 需要转成网络序.

- 类型: 头文件< netinet/in.h >,一般为uint16_t.


struct in_addr sin_addr;

- 作用: 指明ip地址.

- 使用: 需要转成网络序.

- 细节: 曾经是个联合体,允许多种表达方式,方便ABC类地址,随子网技术和无类地址编排出现,已经不需要联合了.

- 结构体:struct in_addr{ in_addr_t s_addr; };

ps: in_addr_t在头文件< netinet/in.h >中.


char sin_zero[8];

- 作用: 填充字节,以便和通用结构体对齐.

- 使用: 一般在声明结构体后马上置零整个结构体即可.

3. IPv6套接字地址结构:

3.1 结构体:

struct in6_addr{
    unit8_t s6_addr[16];
};
#define SIN6_LEN
struct sockaddr_in6{
    uint8_t sin6_len;
    sa_family_t sin6_family;
    in_port_t sin6_port;
};

posted on 2017-12-08 18:49  willaty  阅读(578)  评论(0编辑  收藏  举报

导航