Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Ouroboros.Network.Snocket
Synopsis
- newtype Accept m fd addr = Accept {}
- data Accepted fd addr where
- AcceptFailure ∷ !SomeException → Accepted fd addr
- Accepted ∷ !fd → !addr → Accepted fd addr
- data AddressFamily addr where
- data Snocket m fd addr = Snocket {
- getLocalAddr ∷ fd → m addr
- getRemoteAddr ∷ fd → m addr
- addrFamily ∷ addr → AddressFamily addr
- open ∷ AddressFamily addr → m fd
- openToConnect ∷ addr → m fd
- connect ∷ fd → addr → m ()
- bind ∷ fd → addr → m ()
- listen ∷ fd → m ()
- accept ∷ fd → m (Accept m fd addr)
- close ∷ fd → m ()
- makeSocketBearer ∷ MakeBearer IO Socket
- type SocketSnocket = Snocket IO Socket SockAddr
- socketSnocket ∷ IOManager → SocketSnocket
- type LocalSnocket = Snocket IO LocalSocket LocalAddress
- localSnocket ∷ IOManager → LocalSnocket
- makeLocalBearer ∷ MakeBearer IO LocalSocket
- newtype LocalSocket = LocalSocket {
- getLocalHandle ∷ LocalHandle
- newtype LocalAddress = LocalAddress {}
- localAddressFromPath ∷ FilePath → LocalAddress
- newtype TestAddress addr = TestAddress {
- getTestAddress ∷ addr
- newtype FileDescriptor = FileDescriptor {}
- socketFileDescriptor ∷ Socket → IO FileDescriptor
- localSocketFileDescriptor ∷ LocalSocket → IO FileDescriptor
- newtype MakeBearer (m ∷ Type → Type) fd = MakeBearer {}
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
.
data Accepted fd addr where Source #
Constructors
AcceptFailure ∷ !SomeException → Accepted fd addr | |
Accepted ∷ !fd → !addr → Accepted fd addr |
data AddressFamily addr where Source #
We support either sockets or named pipes.
There are three families of addresses: SocketFamily
used 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 |
Instances
Show addr ⇒ Show (AddressFamily addr) Source # | |
Defined in Ouroboros.Network.Snocket | |
Eq addr ⇒ Eq (AddressFamily addr) Source # | |
Defined in Ouroboros.Network.Snocket Methods (==) ∷ AddressFamily addr → AddressFamily addr → Bool Source # (/=) ∷ AddressFamily addr → AddressFamily addr → Bool Source # |
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 Snockets
Arguments
∷ IOManager |
Though it could be used in |
→ SocketSnocket |
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
Generic LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket | |
Show LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket | |
Eq LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket Methods (==) ∷ LocalSocket → LocalSocket → Bool Source # (/=) ∷ LocalSocket → LocalSocket → Bool Source # | |
type Rep LocalSocket Source # | |
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
newtype TestAddress addr Source #
Constructors
TestAddress | |
Fields
|
Instances
newtype FileDescriptor Source #
Socket file descriptor.
Constructors
FileDescriptor | |
Fields |
Instances
Generic FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket Methods from ∷ FileDescriptor → Rep FileDescriptor x Source # to ∷ Rep FileDescriptor x → FileDescriptor Source # | |
Show FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket | |
type Rep FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket type Rep FileDescriptor = D1 ('MetaData "FileDescriptor" "Ouroboros.Network.Snocket" "ouroboros-network-framework-0.6.0.1-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.