{-# LANGUAGE CPP #-}-- |-- Module : Network.Socket.ByteString.Lazy-- Copyright : (c) Bryan O'Sullivan 2009-- License : BSD-style---- Maintainer : bos@serpentine.com-- Stability : experimental-- Portability : POSIX, GHC---- This module provides access to the BSD /socket/ interface. For detailed-- documentation, consult your favorite POSIX socket reference. All functions-- communicate failures by converting the error number to an-- 'System.IO.Error.IOError'.---- This module is made to be imported with "Network.Socket" like so:---- > import Network.Socket-- > import Network.Socket.ByteString.Lazy-- > import Prelude hiding (getContents)--moduleNetwork.Socket.ByteString.Lazy(-- * Send data to a socketsend ,sendAll -- * Receive data from a socket,getContents ,recv )whereimportData.ByteString.Lazy.Internal(ByteString(..),defaultChunkSize)importNetwork.Socket (ShutdownCmd (..),shutdown )importPreludehiding(getContents)importSystem.IO.Unsafe(unsafeInterleaveIO)importSystem.IO.Error(catchIOError)
#if defined(mingw32_HOST_OS)
importNetwork.Socket.ByteString.Lazy.Windows(send,sendAll)
#else
importNetwork.Socket.ByteString.Lazy.Posix (send ,sendAll )
#endif
importqualifiedData.ByteStringasSimportqualifiedNetwork.Socket.ByteString asNimportNetwork.Socket.Imports importNetwork.Socket.Types -- ------------------------------------------------------------------------------- Receiving-- | Receive data from the socket. The socket must be in a connected-- state. Data is received on demand, in chunks; each chunk will be-- sized to reflect the amount of data received by individual 'recv'-- calls.---- All remaining data from the socket is consumed. When there is no-- more data to be received, the receiving side of the socket is shut-- down. If there is an error and an exception is thrown, the socket-- is not shut down.getContents ::Socket -- ^ Connected socket->IOByteString-- ^ Data receivedgetContents :: Socket -> IO ByteString
getContents Socket
s =IO ByteString
loop whereloop :: IO ByteString
loop =forall a. IO a -> IO a
unsafeInterleaveIOforall a b. (a -> b) -> a -> b
$doByteString
sbs <-Socket -> Int -> IO ByteString
N.recv Socket
s Int
defaultChunkSizeifByteString -> Bool
S.nullByteString
sbs thendoSocket -> ShutdownCmd -> IO ()
shutdown Socket
s ShutdownCmd
ShutdownReceive forall a. IO a -> (IOError -> IO a) -> IO a
`catchIOError`forall a b. a -> b -> a
const(forall (m :: * -> *) a. Monad m => a -> m a
return())forall (m :: * -> *) a. Monad m => a -> m a
returnByteString
EmptyelseByteString -> ByteString -> ByteString
ChunkByteString
sbs forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>IO ByteString
loop -- | Receive data from the socket. The socket must be in a connected-- state. This function may return fewer bytes than specified. If-- the received data is longer than the specified length, it may be-- discarded depending on the type of socket. This function may block-- until a message arrives.---- If there is no more data to be received, returns an empty 'ByteString'.recv ::Socket -- ^ Connected socket->Int64-- ^ Maximum number of bytes to receive->IOByteString-- ^ Data receivedrecv :: Socket -> Int64 -> IO ByteString
recv Socket
s Int64
nbytes =ByteString -> ByteString
chunk forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Socket -> Int -> IO ByteString
N.recv Socket
s (forall a b. (Integral a, Num b) => a -> b
fromIntegralInt64
nbytes )wherechunk :: ByteString -> ByteString
chunk ByteString
k |ByteString -> Bool
S.nullByteString
k =ByteString
Empty|Bool
otherwise=ByteString -> ByteString -> ByteString
ChunkByteString
k ByteString
Empty

AltStyle によって変換されたページ (->オリジナル) /