首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在下面的示例中不应该使用缓冲?

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

Stack Overflow用户
提问于 2014-07-22 19:24:04
回答 1查看 148关注 0票数 2

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

代码语言:javascript
复制
sockHandler :: Socket -> IO ()
sockHandler sock = do
    (handle, _, _) <- accept sock
    hSetBuffering handle NoBuffering
    forkIO $ commandProcessor handle
    sockHandler sock

它接受一个连接,并将其分叉到一个新线程。他一边破译密码,一边说:

“接下来,我们使用hSetBuffering将客户端的套接字句柄的缓冲模式更改为NoBuffering,这样我们就不会有缓冲惊喜。”

但没有详细说明这一点。他在说什么惊喜?我在谷歌上看到了一些安全文章(我猜这些文章与被拦截的缓存有关),但似乎与本教程的内容无关。

有什么问题吗?我曾想过,但我认为我没有足够的人际交往经验来填补空白。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-22 19:55:21

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

代码语言:javascript
复制
 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。这必须手动插入在“右”点,并容易出错。一个更懒惰的选择是完全禁用缓冲--这是比较安全的,尽管它会严重影响性能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24896021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档