跳转至

endpoint

  • 功能:对 socket address 的封装,持有端口和 ip 地址信息,支持 ipv4 和 ipv6。

1 endpoint 类成员

endpoint 类最重要的是这个联合体成员,是对通用套接字地址结构 sockaddripv4 套接字地址结构 sockaddr_inipv6 套接字地址结构 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 类构造

此构造只是众多构造函数中的一个,主要是根据 familyport 初始化成员 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;
  ... 省略 ...
}