Tcl中的并发TCP服务器

时间:2013-05-25 11:33:54

标签: tcp tcl

我必须为遗留应用程序(独立)编写TCP服务器,以便为其创建客户端 - 服务器接口。

我打算编写预分叉(因为线程安全问题而无法用户线程)并发服务器。我需要做两件事。

Q值。一个简单的示例程序(可能是echo-server),解释预分叉并发服务器的关注点和成分。

Q值。服务器将以JSON格式交换数据。如何配置客户端套接字,以便服务器正确地知道客户端是否已完全在通道上写入json,或者它仍在编写过程中。

1 个答案:

答案 0 :(得分:2)

为什么要使用线程或叉子?只需使用Tcl的事件驱动模型。

proc accept {sock host port} {
    fconfigure $sock -blocking 0 -buffering line
    fileevent $sock readable [list readsock $sock]
}

proc readsock {sock} {
    global sockbuf
    if {[read $sock data] < 0} {
       if {[eof $sock]} {
           # Socket was closed by remote
           unset sockbuf($sock)
           close $sock
           return
       }
    }
    append sockbuf($sock) $data\n
    # Check if you got all the necessary data. For Tcl lists, use [info complete]
    if {[info complete $sockbuf($sock)]} {
        set data $sockbuf($sock)
        unset sockbuf($sock)
        # process data
        puts $sock $data
    }
}

socket -server accept 12345
vwait forever; # This will enter the event loop.

如果你真的需要(或想要)使用线程,线程安全在Tcl中也不是问题 但是使用forks通常最终会重新实现thread API。

如果您真的想要分叉,那么您将遇到一些问题:

  1. 你必须与孩子沟通。我建议使用烟斗。
  2. 您必须将套接字从主服务器传递给其他子服务器。虽然这可能适用于C级别的unix域套接字,但我不知道任何可以做到这一点的Tcl扩展。
  3. 您必须自己编写池内容(或者使用C库)。
  4. 恕我直言,不值得为叉子付出所有必要的努力。