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 #

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

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

data AddressFamily addr where Source #

We support either sockets or named pipes.

Instances

Instances details
Eq (AddressFamily addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

(==) :: AddressFamily addr -> AddressFamily addr -> Bool #

(/=) :: AddressFamily addr -> AddressFamily addr -> Bool #

Show (AddressFamily addr) Source # 
Instance details

Defined in Ouroboros.Network.Snocket

Methods

showsPrec :: Int -> AddressFamily addr -> ShowS #

show :: AddressFamily addr -> String #

showList :: [AddressFamily addr] -> ShowS #

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

type LocalSnocket = Snocket IO LocalSocket LocalAddress Source #

System dependent LocalSnocket

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 LocalSocket :: Type -> Type #

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 

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 LocalAddress :: Type -> Type #

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-KkueAIRtlld4DOJE9pzECA" 'True) (C1 ('MetaCons "LocalAddress" 'PrefixI 'True) (S1 ('MetaSel ('Just "getFilePath") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 FilePath)))

data FileDescriptor Source #

Socket file descriptor.

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 FileDescriptor :: Type -> Type #

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-KkueAIRtlld4DOJE9pzECA" '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.