为什么在以下示例中不使用缓冲?

致癌物质

我正在阅读本教程: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Sailsjs:以下代码中为什么不使用* return *?

来自分类Dev

在此示例中,为什么ngx-mat-select-search不使用动态数据?

来自分类Dev

为什么在以下示例中std :: map :: insert失败?

来自分类Dev

为什么在以下angularjs示例中未定义$ q?

来自分类Dev

为什么不使用shell_exec而不是使用输出缓冲将文件“包含”到变量中?

来自分类Dev

为什么我们使用char *作为缓冲区,为什么不使用boost :: asio中的字符串呢?

来自分类Dev

为什么在我的实现中文本不使用nvgText()渲染但在示例中可以正常工作?

来自分类Dev

为什么不使用StreamProvider中的getUriFromFile?

来自分类Dev

为什么即使在以下示例中,n约简也不适用于滤波器?

来自分类Dev

在以下示例中,为什么inline-block元素不占据全高?

来自分类Dev

为什么在以下示例中明确声明了生命周期?

来自分类Dev

为什么在以下阻塞队列示例中调用notify()的顺序很重要?

来自分类Dev

为什么在委托中使用协方差的以下示例无法编译?

来自分类常见问题

为什么官方的Qt示例和教程不使用智能指针?

来自分类Dev

为什么这个简单的Highcarts JS Fiddle示例不使用SetCategories调用重置XAxis?

来自分类Dev

在此示例中,为什么使用元组比列表快?

来自分类Dev

为什么不使用setXXXSize()?

来自分类Dev

为什么不使用@messages?

来自分类Dev

为什么不使用UASP

来自分类Dev

在以下示例中,如何使用PHP foreach?

来自分类Dev

为什么PostgreSQL在此查询中不使用索引

来自分类Dev

为什么这个简单的查询不使用postgres中的索引?

来自分类Dev

为什么在无监督学习中不使用DropOut?

来自分类Dev

为什么不使用Java 8中的默认构造函数?

来自分类Dev

为什么GLib在这些函数中不使用'const'?

来自分类Dev

为什么在Java中不使用int基本类型

来自分类Dev

为什么不使用StreamWriter在输出中写入任何行

来自分类Dev

为什么在锚中不使用交互式元素?

来自分类Dev

为什么不使用double函数中声明的数字?(C)

Related 相关文章

  1. 1

    Sailsjs:以下代码中为什么不使用* return *?

  2. 2

    在此示例中,为什么ngx-mat-select-search不使用动态数据?

  3. 3

    为什么在以下示例中std :: map :: insert失败?

  4. 4

    为什么在以下angularjs示例中未定义$ q?

  5. 5

    为什么不使用shell_exec而不是使用输出缓冲将文件“包含”到变量中?

  6. 6

    为什么我们使用char *作为缓冲区,为什么不使用boost :: asio中的字符串呢?

  7. 7

    为什么在我的实现中文本不使用nvgText()渲染但在示例中可以正常工作?

  8. 8

    为什么不使用StreamProvider中的getUriFromFile?

  9. 9

    为什么即使在以下示例中,n约简也不适用于滤波器?

  10. 10

    在以下示例中,为什么inline-block元素不占据全高?

  11. 11

    为什么在以下示例中明确声明了生命周期?

  12. 12

    为什么在以下阻塞队列示例中调用notify()的顺序很重要?

  13. 13

    为什么在委托中使用协方差的以下示例无法编译?

  14. 14

    为什么官方的Qt示例和教程不使用智能指针?

  15. 15

    为什么这个简单的Highcarts JS Fiddle示例不使用SetCategories调用重置XAxis?

  16. 16

    在此示例中,为什么使用元组比列表快?

  17. 17

    为什么不使用setXXXSize()?

  18. 18

    为什么不使用@messages?

  19. 19

    为什么不使用UASP

  20. 20

    在以下示例中,如何使用PHP foreach?

  21. 21

    为什么PostgreSQL在此查询中不使用索引

  22. 22

    为什么这个简单的查询不使用postgres中的索引?

  23. 23

    为什么在无监督学习中不使用DropOut?

  24. 24

    为什么不使用Java 8中的默认构造函数?

  25. 25

    为什么GLib在这些函数中不使用'const'?

  26. 26

    为什么在Java中不使用int基本类型

  27. 27

    为什么不使用StreamWriter在输出中写入任何行

  28. 28

    为什么在锚中不使用交互式元素?

  29. 29

    为什么不使用double函数中声明的数字?(C)

热门标签

归档