每隔30秒tcl ping一次消息

时间:2015-11-25 19:07:09

标签: sockets tcl

我正在使用tcl和tk关注实际编程的echo服务示例,并且我有一些问题(在tcl中)关于基于该代码实现一些额外的东西。

我试图每隔30秒向所有客户端发送一条消息。我正在使用wiki http://wiki.tcl.tk/9299中定义的“每个”程序,“要限制重复次数,请使用return:[...]”。一旦用户离开服务器(通过关闭套接字),每个函数仍然运行,我收到错误消息。如何检查套接字是否仍然打开,如果不是,我会停止发送消息?

1 个答案:

答案 0 :(得分:1)

every脚本非常简单,因为它没有提供取消重复的简单机制。但是,您使用的版本非常简单,可以很好地处理终止事务。您必须抓住错误(来自已关闭的频道)并通过return响应,这会阻止after被使用。

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}
every 30000 {
    if {[catch {
        puts $::channel "Hi there!"
    }]} return
}

使用帮助程序和使用list生成的回调技术这样做可能更好,这可以触及Tcl的一些更高级的功能:

proc every {ms body} {
    eval $body
    after $ms [info level 0]
}
proc sendThePing {channel} {
    if {[catch {
        puts $channel "Hi there!"
    }]} {
        # Make the _caller_ (every) return!
        return -level 2 done
    }
}

every 30000 [list sendThePing $theChannel]

这更适合处理多个连接,更复杂的参数传递等等。