ouroboros-network-framework-0.1.0.0
Safe HaskellNone
LanguageHaskell2010

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 ∷ !SomeExceptionAccepted fd addr 
Accepted ∷ !fd → !addr → Accepted fd addr 

Instances

Instances details
Bifoldable Accepted Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

bifoldMonoid m ⇒ Accepted m m → m Source #

bifoldMapMonoid 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 #

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 #

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 LocalAddresses (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 ∷ !LocalAddressAddressFamily LocalAddress 
TestFamilyAddressFamily (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'. .

Instances

Instances details
Eq addr ⇒ Eq (AddressFamily addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

(==)AddressFamily addr → AddressFamily addr → Bool Source #

(/=)AddressFamily addr → AddressFamily addr → Bool Source #

Show addr ⇒ Show (AddressFamily addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

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

  • getLocalAddr ∷ fd → m addr
     
  • getRemoteAddr ∷ fd → m addr
     
  • addrFamily ∷ addr → AddressFamily addr
     
  • openAddressFamily addr → m fd

    Open a file descriptor (socket / namedPipe). For named pipes this is using CreateNamedPipe syscall, for Berkeley sockets socket is used.

  • openToConnect ∷ addr → m fd

    A way to create fd to pass to connect. For named pipes it will use CreateFile syscall. For Berkeley sockets this the same as open.

    For named pipes we need full addr rather than just address family as it is for sockets.

  • connect ∷ fd → addr → m ()

    connect is only needed for Berkeley sockets, for named pipes this is no-op.

  • bind ∷ fd → addr → m ()
     
  • listen ∷ fd → m ()
     
  • accept ∷ fd → m (Accept m fd addr)
     
  • close ∷ fd → m ()
     
  • toBearerDiffTime → Tracer m MuxTrace → fd → m (MuxBearer m)
     

Socket based Snockets

type SocketSnocket = Snocket IO Socket SockAddr Source #

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

type LocalSnocket = Snocket IO LocalSocket LocalAddress Source #

System dependent LocalSnocket

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 LocalSocket Source #

System dependent LocalSnocket type

Constructors

LocalSocket 

Fields

Instances

Instances details
Eq LocalSocket Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Show LocalSocket Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Generic LocalSocket Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Associated Types

type Rep LocalSocketTypeType Source #

type Rep LocalSocket Source # 
Instance details

Defined in Ouroboros.Network.Snocket

newtype LocalAddress Source #

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

Windows with `named-pipes`.

Constructors

LocalAddress 

Fields

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

Associated Types

type Rep LocalAddressTypeType Source #

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.0-inplace" '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

Methods

(==)TestAddress addr → TestAddress addr → Bool Source #

(/=)TestAddress addr → TestAddress addr → Bool Source #

Ord addr ⇒ Ord (TestAddress addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

compareTestAddress addr → TestAddress addr → Ordering Source #

(<)TestAddress addr → TestAddress addr → Bool Source #

(<=)TestAddress addr → TestAddress addr → Bool Source #

(>)TestAddress addr → TestAddress addr → Bool Source #

(>=)TestAddress addr → TestAddress addr → Bool Source #

maxTestAddress addr → TestAddress addr → TestAddress addr Source #

minTestAddress addr → TestAddress addr → TestAddress addr Source #

Show addr ⇒ Show (TestAddress addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

showsPrecIntTestAddress addr → ShowS Source #

showTestAddress addr → String Source #

showList ∷ [TestAddress addr] → ShowS Source #

Generic (TestAddress addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Associated Types

type Rep (TestAddress addr) ∷ TypeType Source #

Methods

fromTestAddress addr → Rep (TestAddress addr) x Source #

toRep (TestAddress addr) x → TestAddress addr 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.0-inplace" 'True) (C1 ('MetaCons "TestAddress" 'PrefixI 'True) (S1 ('MetaSel ('Just "getTestAddress") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 addr)))

newtype FileDescriptor Source #

Socket file descriptor.

Constructors

FileDescriptor 

Instances

Instances details
Show FileDescriptor Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Generic FileDescriptor Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Associated Types

type Rep FileDescriptorTypeType Source #

type Rep FileDescriptor Source # 
Instance details

Defined in Ouroboros.Network.Snocket

type Rep FileDescriptor = D1 ('MetaData "FileDescriptor" "Ouroboros.Network.Snocket" "ouroboros-network-framework-0.1.0.0-inplace" 'True) (C1 ('MetaCons "FileDescriptor" 'PrefixI 'True) (S1 ('MetaSel ('Just "getFileDescriptor") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int)))

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.