Mercurial > projects > dreactor
diff asyncdreactor/transport/AsyncSocketConduit.d @ 11:5836613d16ac
reorg! reorg!
author | rick@minifunk |
---|---|
date | Tue, 12 Aug 2008 16:59:56 -0400 |
parents | dreactor/transport/AsyncSocketConduit.d@e3dbc9208822 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/asyncdreactor/transport/AsyncSocketConduit.d Tue Aug 12 16:59:56 2008 -0400 @@ -0,0 +1,227 @@ +/******************************************************************************* + +copyright: Copyright (c) 2004 Kris Bell. All rights reserved + +license: BSD style: $(LICENSE) + +version: Mar 2004 : Initial release +version: Jan 2005 : RedShodan patch for timeout query +version: Dec 2006 : Outback release + +author: Kris, modified by Rick Richardson (May 2008) + + *******************************************************************************/ + +module dreactor.transport.AsyncSocketConduit; + +private import tango.time.Time; + +public import tango.io.Conduit; + +private import tango.net.Socket; + +/******************************************************************************* + + A wrapper around the bare Socket to implement the IConduit abstraction + and add socket-specific functionality specifically for multiplexing via + poll and the ilk. + + AsyncSocketConduit data-transfer is typically performed in conjunction with + an IBuffer, but can happily be handled directly using void array where + preferred + + *******************************************************************************/ + +class AsyncSocketConduit : Conduit +{ + package Socket socket_; + + /*********************************************************************** + + Create a streaming Internet Socket + + ***********************************************************************/ + + this () + { + this (SocketType.STREAM, ProtocolType.TCP); + } + + /*********************************************************************** + + Create an Internet Socket. Used by subclasses and by + ServerSocket; the latter via method allocate() below + + ***********************************************************************/ + + protected this (SocketType type, ProtocolType protocol, bool create=true) + { + socket_ = new Socket (AddressFamily.INET, type, protocol, create); + socket_.blocking(false); + } + + /*********************************************************************** + + Return the name of this device + + ***********************************************************************/ + + override char[] toString() + { + return socket.toString; + } + + /*********************************************************************** + + Return the socket wrapper + + ***********************************************************************/ + + Socket socket () + { + return socket_; + } + + /*********************************************************************** + + Return a preferred size for buffering conduit I/O + + ***********************************************************************/ + + override uint bufferSize () + { + return 1024 * 8; + } + + /*********************************************************************** + + Models a handle-oriented device. + + TODO: figure out how to avoid exposing this in the general + case + + ***********************************************************************/ + + override Handle fileHandle () + { + return cast(Handle) socket_.fileHandle; + } + + /*********************************************************************** + + Is this socket still alive? + + ***********************************************************************/ + + override bool isAlive () + { + return socket_.isAlive; + } + + /*********************************************************************** + + Connect to the provided endpoint + + ***********************************************************************/ + + AsyncSocketConduit connect (Address addr) + { + socket_.connect (addr); + return this; + } + + /*********************************************************************** + + Bind the socket. This is typically used to configure a + listening socket (such as a server or multicast socket). + The address given should describe a local adapter, or + specify the port alone (ADDR_ANY) to have the OS assign + a local adapter address. + + ***********************************************************************/ + + AsyncSocketConduit bind (Address address) + { + socket_.bind (address); + return this; + } + + /************************************************************************** + + Enable the socket for listening + + **************************************************************************/ + AsyncSocketConduit listen(int backlog = 255) + { + socket_.listen(backlog); + return this; + } + + /*********************************************************************** + + Inform other end of a connected socket that we're no longer + available. In general, this should be invoked before close() + is invoked + + The shutdown function shuts down the connection of the socket: + + - stops receiving data for this socket. If further data + arrives, it is rejected. + + - stops trying to transmit data from this socket. Also + discards any data waiting to be sent. Stop looking for + acknowledgement of data already sent; don't retransmit + if any data is lost. + + ***********************************************************************/ + + AsyncSocketConduit shutdown () + { + socket_.shutdown (SocketShutdown.BOTH); + return this; + } + + /*********************************************************************** + + Release this AsyncSocketConduit + + Note that one should always disconnect a AsyncSocketConduit + under normal conditions, and generally invoke shutdown + on all connected sockets beforehand + + ***********************************************************************/ + + override void detach () + { + socket_.detach; + } + + /*********************************************************************** + + Read content from the socket. + + Returns the number of bytes read from the socket, or + IConduit.Eof where there's no more content available + + Return IConduit.Eof if there is an error with the socket. + + ***********************************************************************/ + override uint read (void[] dst) + { + // invoke the actual read op + return socket_.receive(dst); + } + + + /*********************************************************************** + + Callback routine to write the provided content to the + socket. + ***********************************************************************/ + + override uint write (void[] src) + { + return socket_.send (src); + } +} +