gpt4 book ai didi

tcp - Tcl 中的并发 TCP 服务器

转载 作者:可可西里 更新时间:2023-11-01 02:47:12 24 4
gpt4 key购买 nike

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

我计划编写预 fork (由于线程安全问题不能使用线程)并发服务器。我需要做两件事。

问。一个简单的示例程序(可能是回显服务器)解释预 fork 并发服务器的问题和成分。

问。服务器将以 JSON 格式交换数据。如何配置client socket,让server正确知道client是否已经将json写入channel,或者还在写入中。

最佳答案

为什么要使用线程或 fork ?只需使用 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.

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

如果你真的想 fork ,那么这里是你会遇到的一些问题:

  1. 你必须与 children 交流。我建议使用管道。
  2. 您必须将套接字从主节点传递给其他子节点。虽然这对于 C 级别的 unix 域套接字可能是可能的,但我不知道任何可以做到这一点的 Tcl 扩展。
  3. 你必须自己编写池的东西(或为此使用 C 库)。

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

关于tcp - Tcl 中的并发 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16749120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com