我正在阅读本教程: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,因此我们不会感到意外。”
但是,在这一点上没有详细说明。他在说什么惊喜?我在Google上找到了它,并看到了一些安全性文章(我猜这与拦截的缓存有关),但似乎与本教程的内容无关。
有什么问题 我曾考虑过,但我认为我没有足够的网络经验来填补空白。
谢谢。
为了说明起见,假设该协议允许服务器向客户端查询一些信息,例如(下面是愚蠢的示例)
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
在读取前插入一个。必须手动将其插入“正确”的位置,并且容易出错。较为懒惰的选项是完全禁用缓冲-这是更安全的方法,尽管它会严重影响性能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句