Boost logo

Boost :

From: Christopher Kohlhoff (chris_at_[hidden])
Date: 2005-12-31 02:01:38


Hi Jeff,

--- Jeff Garland <jeff_at_[hidden]> wrote:

> A group of folks here in Phoenix got together and had a little
> asio 'review party'.

Times must be tough to need asio as an excuse for beer ;)

> As was discussed early on in the review asio doesn't currently
> support ipv6. However, going forward ipv6 support is critical
> for the "Phoenix Group". Given the current asio interfaces it
> seems clear that the extension will come in the form of
> another namespace -- presumably asio::ipv6. This means that
> client code will need to be modified to make the upgrade to
> ipv6. The need to modify code for ipv6 support was disliked by
> the group. It was the consensus of this group that it would
> be preferable to explore a solution that could support both
> ipv4 and ipv6 addresses seemlessly without changes to client
> code. Part of the rationale for this is that most applications
> don't directly configure the ip addresses in code, but rather
> read them from configurations. Hence it would be nice if the
> upgrade was as simple as swithching over the configuration.
> Thus the same compiled app could directly support ipv4 and
> ipv6.
>
> Thoughts, discussion?

I must preface this by saying I have virtually no IPv6
experience, so feel free to jump in and contribute or correct
details.

In the current design I think this could be accomplished by
adding a new asio::ip namespace that contains:

- An address class that can contain either IPv4 or IPv6 host
  addresses, with functions for converting to and from strings
  (much as asio::ipv4::address does already). It includes a
  function that tells the type of the contained address.

- A host class that contains host names and associated list of
  IPv4 and IPv6 addresses.

- A host_resolver class that resolves host names into a list of
  both IPv4 and IPv6 addresses (if a host supports both).

- A tcp class which is an implementation of the Protocol concept
  (as asio::ipv4::tcp is). However unlike asio::ipv4::tcp this
  one does not return constant values and does not have a
  default constructor. Instead it takes an enum indicating
  whether the protocol is for IPv4 or IPv6, and the values
  returned by its member functions vary accordingly.

- A tcp::endpoint class that contains an address object and a
  port number. The protocol_type typedef for this object is for
  the asio::ip::tcp class.

- The tcp::endpoint::protocol() member function returns a tcp
  object constructed for either IPv4 or IPv6 depending on the
  type of the address object that it contains.

- A similar implementation of this for the udp class.

Some examples:

// Binding to an IPv4 localhost address using a string:
asio::ip::address address("127.0.0.1");
asio::ip::endpoint endpoint(12345, address);
asio::datagram_socket socket(demuxer);
socket.open(endpoint.protocol());
socket.bind(endpoint);

// Same as above using IPv6.
asio::ip::address address("::1");
asio::ip::endpoint endpoint(12345, address);
asio::datagram_socket socket(demuxer);
socket.open(endpoint.protocol());
socket.bind(endpoint);

// Host resolution and connection.
asio::ip::host host;
asio::ip::host_resolver host_resolver(demuxer);
host_resolver.get_host_by_name(host, "foobar");
asio::ip::endpoint endpoint(12345, host.addresses(0));
asio::stream_socket socket(demuxer);
socket.connect(endpoint);

Assuming this works...

- Is it worth keeping separate ipv4 and ipv6 namespaces?
  Some applications may want to explicitly specify one or the
  other.

- How does this fit with Giovanni Deretta's suggestion of
  separate types for each protocol's socket? Does it mean having
  an asio::ip::tcp::socket type, for example? The issue is that
  the concrete protocol (IPv4 or IPv6) needs to be known before
  the socket object is opened.

Cheers,
Chris


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk