|
Boost : |
From: Christopher Kohlhoff (chris_at_[hidden])
Date: 2005-08-18 09:22:16
As discussed in the "surveying async network io libraries" thread, I'd
like to turn asio (asio.sourceforge.net) into a proposal for a boost
networking library. As promised, here is a list of areas where asio
could use some refinement.
I'd appreciate input on:
- What people think of the relative importance of the items. For
example, what would be required for an initial implementation vs
what could or should be left until a later revision.
- Whether the proposed changes are of any value.
- Any other things that should be on the list.
What's Missing
==============
* Asynchronous DNS operations. I think it would be reasonable to say
that any operation that can block should have an asynchronous
equivalent. Should these operations be cancellable (not necessarily
portably implementable anyway)?
* IPv6 support. I have no experience with IPv6, so it would be great
if someone with experience could help out with the design here.
* Asynchronous socket close. In certain circumstances closing a socket
can block, so it would be reasonable to expect an asynchronous close
operation.
* Scatter-gather operations (sendv and recvv).
* The BSD socket functions sendmsg/recvmsg (which I believe are
necessary to support protocols such as SCTP).
* SSL/TLS and DTLS support. This would require an external library,
and how does that fit in with boost?
* Other protocols (PF_UNIX, ...)?
* Some type of integration (or support for) a higher-level
iostreams-based socket library.
* More examples.
* Documentation on design and rationale.
What Should Be Included and What Shouldn't
==========================================
* Obviously asio::thread should not be part of a boost proposal,
since that functionality is already covered by Boost.Thread.
* The asio::time class should probably not be included, and
wherever it's used replaced by Boost.Date-Time.
Naming and Structure
====================
* The use of the word "Stream" can be confusing because its existing
association in C++ with iostreams. Can anyone suggest an
alternative?
* Should stream_socket and dgram_socket be merged into a single socket
class? There other types of sockets (e.g. sequenced packet) that
would require additional classes if the current approach is
retained. This would not be required if the BSD socket APIs were
covered by a single class. Alternatively, should additional classes
be added for the other socket types?
* The current separate socket_connector implementation does not
correspond to an OS resource, unlike socket_acceptor. This can
be problematic, e.g. it prevents a Windows implementation using
ConnectEx, and doesn't allow you to set socket options before the
connection is established. Therefore I propose adding connect and
async_connect operations to socket classes. Should the separate
socket_connector be retained?
* In designing asio I considered that people may want to customise
the demultiplexing strategy associated with each resource. For
example the basic_stream_socket template looks like:
template <typename Service>
class basic_stream_socket;
where Service is a "facet" of the demuxer that provides
demultiplexing facilities for the socket. The typedef for
stream_socket specifies the Service type based on the target
platform.
However in practice I don't believe this level of customisation is
required (to the best of my knowledge no existing asio user
customises it), particularly if asio uses the "best" demultiplexing
mechanism for each platform. Or another way of looking at it:
developers who need this level of control might not use a general
purpose networking library anyway.
An alternative approach would to have the only template parameter be
an allocator (since there is often memory allocation associated with
asynchronous operations). For example:
template <typename Allocator>
class basic_demuxer;
template <typename Allocator>
class basic_stream_socket;
where a stream_socket can only be used with a demuxer that has the
same allocator type. The typedefs for demuxer and stream_socket
would just use the default allocator.
Cheers,
Chris
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk