1

我必须为我的遗留应用程序(独立)编写一个 TCP 服务器来为它创建一个客户端 - 服务器接口。

我打算编写预分叉(由于线程安全问题而不能使用线程)并发服务器。我需要做两件事。

问:一个简单的示例程序(可能是一个回显服务器)解释了一个预先分叉的并发服务器的关注点和成分。

Q. 服务器将以 JSON 格式交换数据。如何配置客户端socket,让服务端正确知道客户端是否已经在channel上写完json或者还在写的过程中。

4

1 回答 1

3

为什么要使用线程或叉子?只需使用 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 中也不是问题。
但是使用分叉通常最终会或多或少地重新实现线程API。

如果你真的想分叉,那么这里有一些你会遇到的问题:

  1. 你必须和孩子们沟通。我建议使用管道。
  2. 您必须将套接字从主人传递给其他孩子。虽然这可能在 C 级别的 unix 域套接字上是可能的,但我不知道有任何 Tcl 扩展可以做到这一点。
  3. 您必须自己编写池内容(或为此使用 C 库)。

恕我直言,不值得为分叉付出所有必要的努力。

于 2013-05-25T12:11:43.503 回答