我必须为遗留应用程序(独立)编写TCP服务器,以便为其创建客户端 - 服务器接口。
我打算编写预分叉(因为线程安全问题而无法用户线程)并发服务器。我需要做两件事。
Q值。一个简单的示例程序(可能是echo-server),解释预分叉并发服务器的关注点和成分。
Q值。服务器将以JSON格式交换数据。如何配置客户端套接字,以便服务器正确地知道客户端是否已完全在通道上写入json,或者它仍在编写过程中。
答案 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。
如果您真的想要分叉,那么您将遇到一些问题:
恕我直言,不值得为叉子付出所有必要的努力。