17#ifndef TOOLBOX_NET_ENDPOINT_HPP
18#define TOOLBOX_NET_ENDPOINT_HPP
25#include <boost/asio/generic/basic_endpoint.hpp>
26#include <boost/asio/ip/basic_endpoint.hpp>
27#include <boost/asio/local/basic_endpoint.hpp>
32template <
typename ProtocolT>
38template <
typename ProtocolT>
39using IpEndpoint = boost::asio::ip::basic_endpoint<ProtocolT>;
44template <
typename ProtocolT>
55 return {
ai->ai_addr,
ai->ai_addrlen,
ai->ai_protocol};
61 return {
ai->ai_addr,
ai->ai_addrlen,
ai->ai_protocol};
68template <
typename StreamT,
typename T>
72 constexpr const char*
scheme =
"unix://";
75 if (path[0] ==
'\0') {
76 size_t size =
ep.size() -
sizeof(std::declval<sockaddr_un>().sun_family) - 1;
77 os <<
scheme <<
'|' << std::string_view{path + 1,
size};
90template <
typename StreamT,
class T>
95 const auto p =
ep.protocol();
120template <
typename StreamT,
class T>
125 const auto p =
ep.protocol();
146inline namespace util {
162template <
typename StreamT>
170 auto write_u8 = [&p](std::uint8_t v) {
171 char rd =
'0' + (v % 10u);
173 char ld =
'0' + ((v / 100u) % 10u);
174 char md =
'0' + ((v / 10u) % 10u);
178 }
else if (v >= 10u) {
179 char ld =
'0' + ((v / 10u) % 10u);
188 uint32_t addr = sa.sin_addr.s_addr;
189 auto* ipv4 = std::bit_cast<unsigned char*>(&addr);
200 os << std::string_view(buf, p) << ntohs(sa.sin_port);
204template <
typename StreamT>
208 char buf[INET6_ADDRSTRLEN];
210 os <<
'[' << buf <<
"]:" << ntohs(sa.sin6_port);
214template <
typename StreamT>
222template <
typename StreamT>
226 if (sa.sa_family == AF_INET) {
227 os << reinterpret_cast<const sockaddr_in&>(sa);
228 }
else if (sa.sa_family == AF_INET6) {
229 os << reinterpret_cast<const sockaddr_in6&>(sa);
230 }
else if (sa.sa_family == AF_UNIX) {
231 os << reinterpret_cast<const sockaddr_un&>(sa);
238template <
typename StreamT>
242 const char* scheme =
"";
243 if (ai.ai_family == AF_INET) {
244 if (ai.ai_protocol == IPPROTO_TCP) {
246 }
else if (ai.ai_protocol == IPPROTO_UDP) {
251 }
else if (ai.ai_family == AF_INET6) {
252 if (ai.ai_protocol == IPPROTO_TCP) {
254 }
else if (ai.ai_protocol == IPPROTO_UDP) {
259 }
else if (ai.ai_family == AF_UNIX) {
262 os << scheme << *ai.ai_addr;
StreamT & operator<<(StreamT &os, const sockaddr_in &sa)
ostream & operator<<(ostream &os, const pair< T, U > &p)