endpoint¶
- 功能:对 socket address 的封装,持有端口和 ip 地址信息,支持 ipv4 和 ipv6。
1 endpoint 类成员¶
endpoint 类最重要的是这个联合体成员,是对通用套接字地址结构 sockaddr、ipv4 套接字地址结构 sockaddr_in、ipv6 套接字地址结构 sockaddr_in6的封装。
class endpoint
{
... 省略 ...
union data_union
{
asio::detail::socket_addr_type base; //对应 sockaddr
asio::detail::sockaddr_in4_type v4; //对应 sockaddr_in
asio::detail::sockaddr_in6_type v6; //对应 sockaddr_in6
} data_;
}
2 endpoint 类构造¶
此构造只是众多构造函数中的一个,主要是根据 family
、port
初始化成员 data_
。
endpoint::endpoint(int family, unsigned short port_num) ASIO_NOEXCEPT
: data_()
{
using namespace std; // For memcpy.
if (family == ASIO_OS_DEF(AF_INET))
{
data_.v4.sin_family = ASIO_OS_DEF(AF_INET);
data_.v4.sin_port =
asio::detail::socket_ops::host_to_network_short(port_num);
data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY);
}
else
{
data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6);
data_.v6.sin6_port =
asio::detail::socket_ops::host_to_network_short(port_num);
data_.v6.sin6_flowinfo = 0;
data_.v6.sin6_addr.s6_addr[0] = 0; data_.v6.sin6_addr.s6_addr[1] = 0;
data_.v6.sin6_addr.s6_addr[2] = 0; data_.v6.sin6_addr.s6_addr[3] = 0;
data_.v6.sin6_addr.s6_addr[4] = 0; data_.v6.sin6_addr.s6_addr[5] = 0;
data_.v6.sin6_addr.s6_addr[6] = 0; data_.v6.sin6_addr.s6_addr[7] = 0;
data_.v6.sin6_addr.s6_addr[8] = 0; data_.v6.sin6_addr.s6_addr[9] = 0;
data_.v6.sin6_addr.s6_addr[10] = 0; data_.v6.sin6_addr.s6_addr[11] = 0;
data_.v6.sin6_addr.s6_addr[12] = 0; data_.v6.sin6_addr.s6_addr[13] = 0;
data_.v6.sin6_addr.s6_addr[14] = 0; data_.v6.sin6_addr.s6_addr[15] = 0;
data_.v6.sin6_scope_id = 0;
}
}
3 basic_endpoint 模板类¶
basic_endpoint 类是对 endpoint 类的封装,模板参数是协议类型类,如 tcp 类型有 tcp 类,udp 协议有 udp 类 - 示例
class tcp
{
public:
/// The type of a TCP endpoint.
typedef basic_endpoint<tcp> endpoint;
... 省略 ...
}
class udp
{
public:
/// The type of a UDP endpoint.
typedef basic_endpoint<udp> endpoint;
... 省略 ...
}