This TIP使我困惑。好像是说-buffering line
使输入缓冲区无限大,当我认为行缓冲只影响输出的刷新?我不能用 -buffersize 5000
连同-buffering line
保护我免受排长队的人的伤害?如果可以,那有什么好处chan pending
?发现缓冲区何时已满而没有换行符?
还是有两个不同的缓冲区?一种只是用于预读数据以节省时间,一种是内部命令,如 gets
和 read
用?
编辑:或者是仅在您使用 gets
时才产生问题因为它不返回部分行?是否gets
将流放入无限大缓冲区模式,否则如果缓冲区在没有换行符的情况下填满,gets 将永远不会返回它?这是 TIP 所说的“行缓冲模式”吗?
最佳答案
首先,-buffersize
选项用于输出,而不是输入。在过去的几年里,我从来不需要设置它; Tcl 的缓冲区管理很不错。
其次,-buffering
选项也用于输出。
第三,如果您使用阻塞 channel ,您很容易受到有人向您发送一条很长的线路的影响。除了等待行尾(或文件尾)到来之外,你没有机会做任何事情。
但是在非阻塞模式下,事情更加微妙。你会得到一个可读的 fileevent
对于 channel (与文件无关,但您可以更轻松地检查它们的大小是否正常,并且在任何情况下它们通常都不是问题)并执行 gets $theChannel line
,返回 -1。 (如果 0 或更多,你有一个完整的行。)
那么-1是什么意思呢?嗯,这意味着要么该行不完整,要么您已经到了流的末尾。您可以通过 fblocked
区分大小写/chan blocked
(或 eof
以检测相反的情况)并且您发现该行还不存在。现在怎么办?使用 chan pending input
查看缓冲了多少数据;如果有一个愚蠢的数量(其中“愚蠢”是可调的),那么是时候放弃 channel 了,因为另一边不好(即,只是 close
它)。
我还没有看到 chan pending output
的真正用途这对可写文件事件并不满意,但这通常不是一个大问题:只需使用 fcopy
/chan copy
将数据从大型来源假脱机到(慢速)输出 channel 工作正常,而不会大量膨胀缓冲区。
关于tcl - 处理来自不受信任的套接字(和其他流)的 DoS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703398/