Endpoints
The endpoint class represents a network endpoint: an IP address (IPv4 or
IPv6) combined with a port number. Endpoints are used for connecting sockets
and binding acceptors.
| Code snippets assume: |
#include <boost/corosio/endpoint.hpp>
#include <boost/url/ipv4_address.hpp>
#include <boost/url/ipv6_address.hpp>
namespace corosio = boost::corosio;
Overview
An endpoint combines an address and port:
// IPv4 endpoint
corosio::endpoint ep4(boost::urls::ipv4_address::loopback(), 8080);
// IPv6 endpoint
corosio::endpoint ep6(boost::urls::ipv6_address::loopback(), 8080);
// Port only (binds to all interfaces)
corosio::endpoint bind_ep(8080);
Construction
From IPv4 Address and Port
auto addr = boost::urls::ipv4_address::loopback(); // 127.0.0.1
corosio::endpoint ep(addr, 8080);
From IPv6 Address and Port
auto addr = boost::urls::ipv6_address::loopback(); // ::1
corosio::endpoint ep(addr, 8080);
Querying Address Type
if (ep.is_v4())
std::cout << "IPv4 address\n";
if (ep.is_v6())
std::cout << "IPv6 address\n";
Accessing Components
Common Address Constants
Loopback
// IPv4 loopback: 127.0.0.1
auto v4_loop = boost::urls::ipv4_address::loopback();
// IPv6 loopback: ::1
auto v6_loop = boost::urls::ipv6_address::loopback();
Parsing Addresses
Parse addresses from strings using Boost.URL:
// IPv4
auto result = boost::urls::parse_ipv4_address("192.168.1.1");
if (result)
{
corosio::endpoint ep(*result, 8080);
}
// IPv6
auto result6 = boost::urls::parse_ipv6_address("2001:db8::1");
if (result6)
{
corosio::endpoint ep(*result6, 8080);
}
Comparison
Endpoints support equality comparison:
corosio::endpoint ep1(boost::urls::ipv4_address::loopback(), 8080);
corosio::endpoint ep2(boost::urls::ipv4_address::loopback(), 8080);
corosio::endpoint ep3(boost::urls::ipv4_address::loopback(), 9090);
assert(ep1 == ep2); // Same address and port
assert(ep1 != ep3); // Different port
From Resolver Results
The resolver returns endpoints:
corosio::resolver r(ioc);
auto [ec, results] = co_await r.resolve("www.example.com", "80");
for (auto const& entry : results)
{
corosio::endpoint ep = entry.get_endpoint();
// Try connecting to ep...
}
Resolver entries implicitly convert to endpoints:
for (corosio::endpoint ep : results)
{
auto [ec] = co_await s.connect(ep);
if (!ec)
break;
}
Internal Representation
The endpoint stores:
-
IPv4 address (always present, may be default)
-
IPv6 address (always present, may be default)
-
Port number (16-bit, host byte order)
-
Address type flag (is_v4)
Both address types are stored to avoid needing a union or variant. The
is_v4 flag indicates which address is active.
Thread Safety
Endpoints are value types with no shared state. They are safe to copy and use from any thread.
Next Steps
-
Sockets — Connect to endpoints
-
Name Resolution — Convert hostnames to endpoints
-
DNS Lookup Tutorial — Practical resolution