Haskell 如何以类似Data.ByteString.Lazy.hGet的阻塞方式使用Network.Connection.connectionGet?

Haskell 如何以类似Data.ByteString.Lazy.hGet的阻塞方式使用Network.Connection.connectionGet?,haskell,network-programming,Haskell,Network Programming,我正在将amqp包从使用GHC.IO.Handle移植到使用Network.Connection.Connection。这样做的动机是获得透明的SSL/TLS支持,以允许来自Haskell的加密AMQP通信 问题是我的基于连接的实现不起作用。当我跟踪替代实现时,我(对我)遇到了一些相当令人惊讶的差异 很明显,网络连接.connectionGet和GHC.IO.Handle.hGet非常不同(非阻塞与阻塞): Network.Connection.connectionGet的作用类似于GHC.

我正在将amqp包从使用GHC.IO.Handle移植到使用Network.Connection.Connection。这样做的动机是获得透明的SSL/TLS支持,以允许来自Haskell的加密AMQP通信

问题是我的基于连接的实现不起作用。当我跟踪替代实现时,我(对我)遇到了一些相当令人惊讶的差异

很明显,网络连接.connectionGetGHC.IO.Handle.hGet非常不同(非阻塞与阻塞):

Network.Connection.connectionGet的作用类似于GHC.IO.Handle.hGetNonBlocking

我用Network.Connection.connectionGet替换了GHC.IO.Handle.hGet,我认为这只是一个替代品,而事实并非如此


如何以阻塞的方式使用Network.Connection.connectionGet,如Data.ByteString.Lazy.hGet

我不会将其称为阻塞与非阻塞,因为这种思想导致了异步IO概念,而异步IO概念与这些API中发生的情况不同

这里的区别是,在
hGet
中,当您请求读取
x
字节数时,它将尝试读取并等待,直到从连接中获得该字节数或连接关闭,其中,
connectionGet
函数将返回它可以从连接缓冲区读取的任何字节,但这些字节的计数将小于或等于请求的字节,即
x

您可以使用如下所示的简单递归,使
connectionGet
的行为类似于
hGet
,注意:以下已验证有效:)

导入合格的网络。连接为Conn
将符合条件的数据.ByteString作为BS导入
将符合条件的Data.ByteString.Char8作为BC导入
-- ... 中间代码
connectionGet':连接->Int->IO BC.ByteString
连接网络连接x=do

bs这里的ByteStringSource是什么?这基本上是正确的。
length
函数应被引用为
BS。length
和类型
ByteStringSource
应为
BC.ByteString
假设
导入合格数据。ByteString as BS
导入合格数据。ByteString.Char8 as BC
在模块中。感谢您这么快发布此消息。我花了一段时间来验证:)
import qualified Network.Connection as Conn
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BC

-- ... intervening code

connectionGet' :: Conn.Connection -> Int -> IO BC.ByteString
connectionGet' conn x = do
                  bs <- Conn.connectionGet conn x
                  let diff = BS.length bs - x
                  if BS.length bs == 0 || diff == 0
                    then do
                      return bs
                    else do
                      next <- connectionGet' conn diff
                      return $ BC.append bs next