套接字地址结构

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;
};

转载于:https://www.cnblogs.com/willaty/p/8006747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值