Safe Haskell | None |
---|---|
Language | Haskell2010 |
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
- SocketFamily :: ! Family -> AddressFamily SockAddr
- LocalFamily :: ! LocalAddress -> AddressFamily LocalAddress
- TestFamily :: AddressFamily ( TestAddress addr)
-
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 ()
- toBearer :: DiffTime -> Tracer m MuxTrace -> fd -> m ( MuxBearer m)
- type SocketSnocket = Snocket IO Socket SockAddr
- socketSnocket :: IOManager -> SocketSnocket
- type LocalSnocket = Snocket IO LocalSocket LocalAddress
- localSnocket :: IOManager -> LocalSnocket
-
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
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 #
AcceptFailure :: ! SomeException -> Accepted fd addr | |
Accepted :: !fd -> !addr -> Accepted fd addr |
Instances
Bifunctor Accepted Source # | |
Bifoldable Accepted Source # | |
Defined in Ouroboros.Network.Snocket |
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
.
SocketFamily :: ! Family -> AddressFamily SockAddr | |
LocalFamily :: ! LocalAddress -> AddressFamily LocalAddress | |
TestFamily :: AddressFamily ( TestAddress addr) |
Using a newtype wrapper
|
Instances
Eq addr => Eq ( AddressFamily addr) Source # | |
Defined in Ouroboros.Network.Snocket (==) :: AddressFamily addr -> AddressFamily addr -> Bool Source # (/=) :: AddressFamily addr -> AddressFamily addr -> Bool Source # |
|
Show addr => Show ( AddressFamily addr) Source # | |
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.
Snocket | |
|
Socket based Snocktes
:: 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
LocalSocket | |
|
Instances
Eq LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket (==) :: LocalSocket -> LocalSocket -> Bool Source # (/=) :: LocalSocket -> LocalSocket -> Bool Source # |
|
Show LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket |
|
Generic LocalSocket Source # | |
Defined in Ouroboros.Network.Snocket from :: LocalSocket -> Rep LocalSocket x Source # to :: Rep LocalSocket x -> LocalSocket 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`.
Instances
newtype TestAddress addr Source #
TestAddress | |
|
Instances
newtype FileDescriptor Source #
Socket file descriptor.
Instances
Show FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket |
|
Generic FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket from :: FileDescriptor -> Rep FileDescriptor x Source # to :: Rep FileDescriptor x -> FileDescriptor Source # |
|
type Rep FileDescriptor Source # | |
Defined in Ouroboros.Network.Snocket
type
Rep
FileDescriptor
=
D1
('
MetaData
"FileDescriptor" "Ouroboros.Network.Snocket" "ouroboros-network-framework-0.1.0.1-8Cos8Lgj9CwATl9eblNk02" '
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.