Sockets 使用“chan pending output”代替可写fileevent

Sockets 使用“chan pending output”代替可写fileevent,sockets,tcl,Sockets,Tcl,哟,我已经用一个简单的协议编写了一个服务器:客户端发送一条线路,服务器发送一条线路作为响应,重复。为了防止客户端通过发送大量行而不接收数据来填充Tcl的输出缓冲区,我可以只检查chan pending output,而不使用writable fileevent吗 proc respond {stream msg} { if {[chan pending output $stream] <= 1024} { puts $stream $msg } else {

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

proc respond {stream msg} {
    if {[chan pending output $stream] <= 1024} {
        puts $stream $msg
    } else {
        #close $stream
    }
}
proc respond{stream msg}{
如果{[chan pending output$stream]用于输出,将正确描述输出队列中等待的字节数。通常,该值将由您
chan配置的
(或
fconfigure
)值限定

只有当通道为非阻塞通道时,才会超过该值;对于阻塞通道,当该值将超过该通道时,反而会对底层设备(套接字、管道、文件、串行线等)进行阻塞写入,因此当您看到该通道超过时,它又回到了限制之下

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

因此,您所做的工作是可行的,但是您必须仔细考虑如果输出缓冲区“满了”该怎么办。;消息可能需要延迟的想法是一个简单的抽象容易泄漏的地方。使用8.6的协程,您可以(可能)执行透明挂起或诸如此类的操作,但要正确完成这类操作可能需要一些思考(例如,GUI客户端可能需要显示忙碌的指示器,并将事情置于用户无法输入更多请求的状态)