gpt4 book ai didi

haskell - 为什么在下面的示例中不应该使用缓冲?

转载 作者:行者123 更新时间:2023-12-02 10:27:29 26 4
gpt4 key购买 nike

我正在阅读本教程: http://www.catonmat.net/blog/simple-haskell-tcp-server/学习 Haskell 网络模块的基础知识。他写了一个名为sockHandler的小函数:

sockHandler :: Socket -> IO ()
sockHandler sock = do
(handle, _, _) <- accept sock
hSetBuffering handle NoBuffering
forkIO $ commandProcessor handle
sockHandler sock

它接受一个连接,并将其 fork 到一个新线程。在分解代码时,他说:

“接下来我们使用 hSetBuffering 将客户端套接字句柄的缓冲模式更改为 NoBuffering,这样我们就不会出现缓冲意外情况。”

但没有详细说明这一点。他在谈论什么令人惊讶的事情?我用 Google 搜索了一下,看到了一些安全文章(我猜这些文章与缓存被拦截有关),但似乎与本教程的内容没有任何关系。

有什么问题吗?我想了一下,但我认为我没有足够的网络经验来填补这个空白。

谢谢。

最佳答案

为了便于说明,假设协议(protocol)允许服务器向客户端查询某些信息,例如(下面是愚蠢的例子)

 hPutStr sock "Please choose between A or B"
choice <- hGetLine sock
case decode choice of
Just A -> handleA
Just B -> handleB
Nothing -> protocolError

一切看起来都很好...但服务器似乎挂起。为什么?这是因为 hPutStr 并未真正通过网络发送该消息。 ,但只是插入到本地缓冲区中。因此,另一端永远不会收到查询,因此不会回复,导致服务器陷入读取困境。

这里的解决方案是插入 hFlush sock读之前。这必须手动插入到“正确”的点,并且很容易出错。一个更懒的选择是完全禁用缓冲——这更安全,尽管它会严重影响性能。

关于haskell - 为什么在下面的示例中不应该使用缓冲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24896021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com