我正在阅读本教程: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它接受一个连接,并将其分叉到一个新线程。他一边破译密码,一边说:
“接下来,我们使用hSetBuffering将客户端的套接字句柄的缓冲模式更改为NoBuffering,这样我们就不会有缓冲惊喜。”
但没有详细说明这一点。他在说什么惊喜?我在谷歌上看到了一些安全文章(我猜这些文章与被拦截的缓存有关),但似乎与本教程的内容无关。
有什么问题吗?我曾想过,但我认为我没有足够的人际交往经验来填补空白。
谢谢。
发布于 2014-07-22 19:55:21
为了举例说明,假设协议允许服务器查询客户端的某些信息,例如(下面是愚蠢的示例)
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。这必须手动插入在“右”点,并容易出错。一个更懒惰的选择是完全禁用缓冲--这是比较安全的,尽管它会严重影响性能。
https://stackoverflow.com/questions/24896021
复制相似问题