ouroboros-network-framework-0.1.0.1
Safe Haskell None
Language Haskell2010

Ouroboros.Network.Snocket

Synopsis

Snocket Interface

newtype Accept m fd addr Source #

Named pipes and Berkeley sockets have different API when accepting a connection. For named pipes the file descriptor created by createNamedPipe is supposed to be used for the first connected client. Named pipe accept loop looks this way:

acceptLoop k = do
  h <- createNamedPipe name
  connectNamedPipe h
  -- h is now in connected state
  forkIO (k h)
  acceptLoop k

For Berkeley sockets equivalent loop starts by creating a socket which accepts connections and accept returns a new socket in connected state

acceptLoop k = do
    s <- socket ...
    bind s address
    listen s
    loop s
  where
    loop s = do
      (s' , _addr') <- accept s
      -- s' is in connected state
      forkIO (k s')
      loop s

To make common API for both we use a recursive type Accept , see berkeleyAccept below. Creation of a socket / named pipe is part of Snocket , but this means we need to have different recursion step for named pipe & sockets. For sockets its recursion step will always return accept syscall; for named pipes the first callback will reuse the file descriptor created by open and only subsequent calls will create a new file descriptor by createNamedPipe , see namedPipeSnocket .

Constructors

Accept

Fields

Instances

Instances details
Functor m => Bifunctor ( Accept m) Source #
Instance details

Defined in Ouroboros.Network.Snocket

Methods

bimap :: (a -> b) -> (c -> d) -> Accept m a c -> Accept m b d Source #

first :: (a -> b) -> Accept m a c -> Accept m b c Source #

second :: (b -> c) -> Accept m a b -> Accept m a c Source #

data Accepted fd addr where Source #

Constructors

AcceptFailure :: ! SomeException -> Accepted fd addr
Accepted :: !fd -> !addr -> Accepted fd addr

Instances

Instances details
Bifunctor Accepted Source #
Instance details

Defined in Ouroboros.Network.Snocket

Methods

bimap :: (a -> b) -> (c -> d) -> Accepted a c -> Accepted b d Source #

first :: (a -> b) -> Accepted a c -> Accepted b c Source #

second :: (b -> c) -> Accepted a b -> Accepted a c Source #

Bifoldable Accepted Source #
Instance details

Defined in Ouroboros.Network.Snocket

Methods

bifold :: Monoid m => Accepted m m -> m Source #

bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> Accepted a b -> m Source #

bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> Accepted a b -> c Source #

bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> Accepted a b -> c Source #

data AddressFamily addr where Source #

We support either sockets or named pipes.

There are three families of addresses: SocketFamily usef for Berkeley sockets, LocalFamily used for LocalAddress es (either Unix sockets or Windows named pipe addresses), and TestFamily for testing purposes.

LocalFamily requires LocalAddress , this is needed to provide path of the opened Win32 HANDLE .

Constructors

SocketFamily :: ! Family -> AddressFamily SockAddr
LocalFamily :: ! LocalAddress -> AddressFamily LocalAddress
TestFamily :: AddressFamily ( TestAddress addr)

Using a newtype wrapper TestAddress makes pattern matches on AddressFamily complete, e.g. it makes AddressFamily injective: AddressFamily addr == AddressFamily addr' then addr == addr' . .

data Snocket m fd addr Source #

Abstract communication interface that can be used by more than Socket . Snockets are polymorphic over monad which is used, this feature is useful for testing and/or simulations.

Constructors

Snocket

Fields

Socket based Snocktes

socketSnocket Source #

Arguments

:: IOManager

IOManager interface. We use it when we create a new socket and when we accept a connection.

Though it could be used in open , but that is going to be used in a bracket so it's better to keep it simple.

-> SocketSnocket

Create a Snocket for the given Family . In the bind method set ReuseAddr and ReusePort .

Local Snockets

localSnocket :: IOManager -> LocalSnocket Source #

Create a LocalSnocket .

On Windows , there is no way to get path associated to a named pipe. To go around this, the address passed to open via LocalFamily will be referenced by LocalSocket .

newtype LocalAddress Source #

Local address, on Unix is associated with AF_UNIX family, on

Windows with `named-pipes`.

Instances

Instances details
Eq LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

Ord LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

Show LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

Generic LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

Hashable LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

type Rep LocalAddress Source #
Instance details

Defined in Ouroboros.Network.Snocket

type Rep LocalAddress = D1 (' MetaData "LocalAddress" "Ouroboros.Network.Snocket" "ouroboros-network-framework-0.1.0.1-8Cos8Lgj9CwATl9eblNk02" ' True ) ( C1 (' MetaCons "LocalAddress" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "getFilePath") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 FilePath )))

newtype TestAddress addr Source #

Constructors

TestAddress

Fields

Instances

Instances details
Eq addr => Eq ( TestAddress addr) Source #
Instance details

Defined in Ouroboros.Network.Snocket

Ord addr => Ord ( TestAddress addr) Source #
Instance details

Defined in Ouroboros.Network.Snocket

Show addr => Show ( TestAddress addr) Source #
Instance details

Defined in Ouroboros.Network.Snocket

Generic ( TestAddress addr) Source #
Instance details

Defined in Ouroboros.Network.Snocket

Associated Types

type Rep ( TestAddress addr) :: Type -> Type Source #

type Rep ( TestAddress addr) Source #
Instance details

Defined in Ouroboros.Network.Snocket

type Rep ( TestAddress addr) = D1 (' MetaData "TestAddress" "Ouroboros.Network.Snocket" "ouroboros-network-framework-0.1.0.1-8Cos8Lgj9CwATl9eblNk02" ' True ) ( C1 (' MetaCons "TestAddress" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "getTestAddress") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 addr)))

socketFileDescriptor :: Socket -> IO FileDescriptor Source #

We use unsafeFdSocket but FileDescriptor constructor is not exposed. This forbids any usage of FileDescriptor (at least in a straightforward way) using any low level functions which operate on file descriptors.