【sylar】框架篇-Chapter10-Address 模块

本文档介绍了一个从零开始构建的C++高性能分布式服务器框架,该框架包括了对IPv4、IPv6和Unix域套接字地址的支持。它提供了网络地址查询、本机网卡地址查询等功能,并通过sockaddr结构体进行抽象。框架中定义了Address基类,以及IPv4Address、IPv6Address、UnixAddress和UnknownAddress等派生类,实现了各种地址类型的操作。此外,还提供了如广播地址、网段地址和子网掩码的操作。

站在巨人的肩膀上

C++高性能分布式服务器框架

从零开始重写sylar C++高性能分布式服务器框架

概述

  • 提供网络地址相关的类,支持与网络地址相关的操作。
  • IPv4 协议对应 IPv4 地址,长度是 32 位;IPv6 协议对应 IPv6 地址,长度是 128 位;Unix 域套接字地址是一个路径字符串。
  • Berkeley 套接字接口拟定了一个通用套接字地址结构 sockaddr,用于表示任意类型的地址,所有的套接字 API 在传入地址参数时都只需要传入 sockaddr 类型,以保证接口的通用性。除通用地址结构 sockaddr 外,还有一系列表示具体的网络地址的结构,这些具体的网络地址结构用于用户赋值,但在使用时,都要转化成 sockaddr 的形式。
sockaddr表示通用套接字地址结构,其定义如下:
struct sockaddr
{
	unsigned short sa_family; // 地址族,也就是地址类型
	char sa_data[14];         // 地址内容
};
  • 所有的套接字 API 都是以指针形式接收 sockaddr 参数,并且额外需要一个地址长度参数,这可以保证当 sockaddr 本身不足以容纳一个具体的地址时,可以通过指针取到全部的内容。
  • 除 sockaddr 外,套接字接口还定义了一系列具体的网络地址结构,比如 sockaddr_in 表示 IPv4 地址,sockaddr_in6 表示 IPv6 地址,sockaddr_un 表示 Unix 域套接字地址,它们的定义如下:
struct sockaddr_in 
{
	unsigned short sin_family; // 地址族,IPv4的地址族为AF_INET
	unsigned short sin_port;   // 端口
	struct in_addr sin_addr;   // IP地址,IPv4的地址用一个32位整数来表示
	char sin_zero[8];          // 填充位,填零即可
};
	
struct sockaddr_in6
{
	unsigned short sin6_family; // 地址族,IPv6的地址族为AF_INET6
	in_port_t sin6_port;	   	// 端口
	uint32_t sin6_flowinfo;	    // IPv6流控信息
	struct in6_addr sin6_addr;	// IPv6地址,实际为一个128位的结构体
	uint32_t sin6_scope_id;	    // IPv6 scope-id
};
	
struct sockaddr_un
{
	unsigned short sun_family;  // 地址族,Unix域套字地址族为AF_UNIX
	char sun_path[108];         // 路径字符串
};

Address

  • 所有网络地址的基类,抽象类,对应 sockaddr 类型,但只包含抽象方法,不包含具体的成员。
  • 除此外,Address 作为地址类还提供了网络地址查询(通过 getaddrinfo() 函数)及本机网卡地址查询功能(通过 getifaddrs() 函数),其中网络地址查询功能可以实现域名解析,网卡地址查询可以获取本机指定网卡的 IP 地址。

IPAddress

  • 继承自 Address。
  • IP地址的基类,抽象类,在 Address 基类的基础上,增加了 IP 地址相关的端口以及广播地址、网段地址、子网掩码操作,但只包含抽象方法,不包含具体的成员。

IPv4Address

  • 继承自 IPAddress。
  • IPv4 地址类,实体类,表示一个 IPv4 地址,对应 sockaddr_in 类型,包含一个 sockaddr_in 成员,可以操作该成员的网络地址和端口,以及获取广播地址、网段地址、子网掩码操作。

IPv6Address

  • 继承自 IPAddress。
  • IPv6 地址类,实体类,表示一个 IPv6 地址,对应 sockaddr_in6 类型,包含一个 sockaddr_in6 成员,可以操作该成员的网络地址和端口,以及获取广播地址、网段地址、子网掩码操作。

UnixAddress

  • 继承自 Address。
  • Unix 域套接字类,实体类,表示一个 Unix Socket 地址,对应 sockaddr_un 类型,包含一个 sockaddr_un 对象以及一个路径字符串长度。

UnknownAddress

  • 继承自 Address。
  • 表示一个未知类型的套接字地址,实体类,对应 sockaddr 类型,该类与 Address 类的区别是它包含一个 sockaddr 成员,并且是一个实体类。

其他说明

  • 注意大小端问题,sylar 封装了 byteswapOnLittleEndian() 等方法用于大小端转换。

关系图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值