使用`chan pending output`而不是writeable fileevent

时间:2013-10-16 17:03:54

标签: sockets tcl

哟,我写了一个简单协议的服务器:客户端发送一行,服务器发回一行作为响应,重复。为了防止客户端通过发送大量行但不接受数据来填充Tcl的输出缓冲区,我可以只检查chan pending output而不是使用可写的fileevent吗?

proc respond {stream msg} {
    if {[chan pending output $stream] <= 1024} {
        puts $stream $msg
    } else {
        #close $stream
    }
}

1 个答案:

答案 0 :(得分:1)

对于输出,chan pending output将正确描述输出队列中等待的字节数。通常情况下,该值会受到您-buffersize(或chan configure)所具有的fconfigure值的限制。

当频道非阻塞时,只会超过该值;有一个阻塞通道,当值超过它时,而是对底层设备(套接字,管道,文件,串行线等)进行阻塞写入,所以当你看到它已经过去时,它会回到再次限制。

但是如果您使用非阻止频道,则应该使用chan event(或fileevent)。幸运的是,对于实际的写入,Tcl实际上会自动为您执行此操作;您可以从可写事件中获得的最有用的东西已经存在。实际上,可写事件的最常见的实际使用是检测异步套接字连接何时为服务做好准备。

所以你正在做的事情会起作用,但你必须仔细考虑如果输出缓冲区“满员”该怎么做;消息需要延迟的想法是一个简单的抽象容易变得漏洞的地方。使用8.6的协同程序,你可以(可能)做一个透明的暂停或类似的东西,但是那种正确的东西可以考虑一下。 (例如,GUI客户端可能需要显示忙碌指示符并将事物置于用户无法输入更多请求的状态。)