@@ -32,13 +32,8 @@
33module Streamly.Network.Socket
33module Streamly.Network.Socket
35− -- ** Listen for Connections
37− , recvConnectionsWith
40− -- ** Read a stream from a connection
35+ -- * Read from connection
41− , fromSocket
36+ fromSocket
43 -- , readUtf8
38 -- , readUtf8
44 -- , readLines
39 -- , readLines
@@ -53,7 +48,7 @@ module Streamly.Network.Socket
53 -- , readArraysOf
48 -- , readArraysOf
54 , readArrays
49 , readArrays
56− -- ** Write a stream to a connection
51+ -- * Write to connection
58 -- , writeUtf8
53 -- , writeUtf8
59 -- , writeUtf8ByLines
54 -- , writeUtf8ByLines
@@ -63,6 +58,8 @@ module Streamly.Network.Socket
63 -- -- * Array Write
58 -- -- * Array Write
64 , writeArray
59 , writeArray
65 , writeArrays
60 , writeArrays
62+ -- reading/writing datagrams
@@ -76,10 +73,7 @@ import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
76import Foreign.Ptr (minusPtr, plusPtr, Ptr, castPtr)
73import Foreign.Ptr (minusPtr, plusPtr, Ptr, castPtr)
77import Foreign.Storable (Storable(..))
74import Foreign.Storable (Storable(..))
78import GHC.ForeignPtr (mallocPlainForeignPtrBytes)
75import GHC.ForeignPtr (mallocPlainForeignPtrBytes)
79−import Network.Socket
76+import Network.Socket (Socket, sendBuf, recvBuf)
80− (Socket, PortNumber, SocketOption(..), Family(..),
81− SockAddr(..), withSocketsDo, SocketType(..), socket, accept, bind,
82− defaultProtocol, setSocketOption, maxListenQueue, sendBuf, recvBuf)
83#if MIN_VERSION_network(3,1,0)
77#if MIN_VERSION_network(3,1,0)
84import Network.Socket (withFdSocket)
78import Network.Socket (withFdSocket)
@@ -89,7 +83,6 @@ import Prelude hiding (read)
90import qualified Network.Socket as Net
84import qualified Network.Socket as Net
92−import Streamly (MonadAsync)
93import Streamly.Mem.Array.Types (Array(..))
86import Streamly.Mem.Array.Types (Array(..))
94import Streamly.Streams.Serial (SerialT)
87import Streamly.Streams.Serial (SerialT)
95import Streamly.Streams.StreamK.Type (IsStream, mkStream)
88import Streamly.Streams.StreamK.Type (IsStream, mkStream)
@@ -100,71 +93,6 @@ import qualified Streamly.Mem.Array as A
100import qualified Streamly.Mem.Array.Types as A hiding (flattenArrays)
93import qualified Streamly.Mem.Array.Types as A hiding (flattenArrays)
101import qualified Streamly.Prelude as S
94import qualified Streamly.Prelude as S
103−-------------------------------------------------------------------------------
105−-------------------------------------------------------------------------------
107−-- | Specify the configuration of a server.
108−data ServerSpec = ServerSpec
110− serverAddressFamily :: !Family
111− , serverAddress :: !SockAddr
112− , serverSockOpts :: ![(SocketOption, Int)]
115−initListener :: Int -> ServerSpec -> IO Socket
116−initListener tcpListenQ ServerSpec{..} =
118− sock <- socket serverAddressFamily Stream defaultProtocol
119− mapM_ (\(opt, val) -> setSocketOption sock opt val) serverSockOpts
120− bind sock serverAddress
121− Net.listen sock tcpListenQ
124−-- | Start a TCP stream server. The server listens for connections on the
125−-- supplied address (address family, local interface IP address and port) and
126−-- generates a stream of connected sockets and the endpoint they are connected
127−-- to. The first argument is the maximum number of pending connections in the
129−{-# INLINE recvConnectionTuplesWith #-}
130−recvConnectionTuplesWith :: MonadAsync m
131− => Int -> ServerSpec -> SerialT m (Socket, SockAddr)
132−recvConnectionTuplesWith tcpListenQ opts = S.unfoldrM step Nothing
135− listener <- liftIO $ initListener tcpListenQ opts
136− r <- liftIO $ accept listener
137− -- XXX error handling
138− return $ Just (r, Just listener)
140− step (Just listener) = do
141− r <- liftIO $ accept listener
142− -- XXX error handling
143− return $ Just (r, Just listener)
145−{-# INLINE recvConnectionsWith #-}
146−recvConnectionsWith :: MonadAsync m => Int -> ServerSpec -> SerialT m Socket
147−recvConnectionsWith tcpListenQ opts = fmap fst $
148− recvConnectionTuplesWith tcpListenQ opts
150−{-# INLINE recvConnectionTuplesOn #-}
151−recvConnectionTuplesOn :: MonadAsync m
152− => PortNumber -> SerialT m (Socket, SockAddr)
153−recvConnectionTuplesOn port =
154− recvConnectionTuplesWith maxListenQueue ServerSpec
155− { serverAddressFamily = AF_INET
156− , serverAddress = SockAddrInet port 0
157− , serverSockOpts = [(NoDelay,1), (ReuseAddr,1)]
160−{-# INLINE recvConnectionsOn #-}
161−recvConnectionsOn :: MonadAsync m => PortNumber -> SerialT m Socket
162−recvConnectionsOn = fmap fst . recvConnectionTuplesOn
164−-- | Read a stream of Word8 from a socket, closing the socket when done.
165−fromSocket :: (MonadCatch m, MonadIO m) => Socket -> SerialT m Word8
166−fromSocket sk = S.finally (liftIO (Net.close sk)) (read sk)
168-------------------------------------------------------------------------------
96-------------------------------------------------------------------------------
169-- Array IO (Input)
97-- Array IO (Input)
170-------------------------------------------------------------------------------
98-------------------------------------------------------------------------------
@@ -307,6 +235,10 @@ readByChunksUpto chunkSize h = A.flattenArrays $ readArraysUpto chunkSize h
307read :: (IsStream t, MonadIO m) => Socket -> t m Word8
235read :: (IsStream t, MonadIO m) => Socket -> t m Word8
308read = A.flattenArrays . readArrays
236read = A.flattenArrays . readArrays
238+-- | Read a stream of Word8 from a socket, closing the socket when done.
239+fromSocket :: (MonadCatch m, MonadIO m) => Socket -> SerialT m Word8
240+fromSocket sk = S.finally (liftIO (Net.close sk)) (read sk)
310-------------------------------------------------------------------------------
242-------------------------------------------------------------------------------
311-- Writing
243-- Writing
312-------------------------------------------------------------------------------
244-------------------------------------------------------------------------------