Network.Socket.ByteString.Lazy 的 sendTo 在哪里?

Posted

技术标签:

【中文标题】Network.Socket.ByteString.Lazy 的 sendTo 在哪里?【英文标题】:Where is Network.Socket.ByteString.Lazy's sendTo? 【发布时间】:2012-06-15 14:14:41 【问题描述】:

Network.Socket.ByteStringNetwork.Socket.ByteString.Lazy 都有一个 send 函数。

Network.Socket.ByteString 有一个 sendTo 函数,但 Network.Socket.ByteString.Lazy 没有。

如何将Network.Socket.ByteString 的sendTo 与Lazy.ByteString 一起使用 Network.Socket.ByteString.Lazysend 函数。 (即我如何告诉它将数据包发送到哪里。)

谁能推荐一个关于 Haskell 字符串的好教程,BytesStrings。 Lazy.ByteStrings 等,因为我发现它们非常令人困惑(来自 Java/Python 背景)。

【问题讨论】:

请注意,sendTo 对发送的数据是严格的,因此将惰性字节串传递给它没有真正的逻辑。这就是为什么该函数只存在于严格的字节串上。 @sclv - 你的答案是正确的(我的是一个解决方案)。您能否发表您的评论作为答案,以便我接受? 【参考方案1】:

请注意,sendTo 对发送的数据是严格的,因此将惰性字节串传递给它没有真正的逻辑。这就是为什么该函数只存在于严格的字节串上。

【讨论】:

【参考方案2】:

答案是创建一个新函数:

import Data.ByteString as BS
import Data.ByteString.Lazy as LBS

lazyToStrictBS :: LBS.ByteString -> BS.ByteString
lazyToStrictBS x = BS.concat $ LBS.toChunks x

并使用它将Lazy.ByteString 转换为普通的ByteString

这是反过来的,这样我以后再用谷歌搜索这个问题时就可以找到它。

import Data.ByteString as BS
import Data.ByteString.Lazy as LBS

strictToLazyBS :: BS.ByteString -> LBS.ByteString
strictToLazyBS x = LBS.fromChunks [x] 

【讨论】:

在大多数现代程序中直接与套接字交互是非常罕见的﹘这就是为什么我所知道的大多数应用程序对惰性字节字符串使用某种形式的抽象(如pipes-network)。另外,+1 表示“这样我以后再用谷歌搜索这个问题时就可以找到它”:)

以上是关于Network.Socket.ByteString.Lazy 的 sendTo 在哪里?的主要内容,如果未能解决你的问题,请参考以下文章