Tcl 读取套接字被阻止

Tcl 读取套接字被阻止,tcl,Tcl,我正在编写一个套接字实用程序,用于将客户端与服务器通信。当从客户端输入到套接字时,服务器可以正常接收。但是,当从服务器向套接字输入时,客户端无法读取。检查fblocked$通道时。是1。我已经尝试了一切,包括添加新的线路。。。 请帮忙 下面是我的代码 proc read_command { sock } { variable self global connected set len [gets $sock line] set bl [fblocked $sock] pu

我正在编写一个套接字实用程序,用于将客户端与服务器通信。当从客户端输入到套接字时,服务器可以正常接收。但是,当从服务器向套接字输入时,客户端无法读取。检查fblocked$通道时。是1。我已经尝试了一切,包括添加新的线路。。。 请帮忙

下面是我的代码

proc read_command { sock } {
  variable self
  global connected

  set len [gets $sock line]
  set bl  [fblocked $sock]
  puts "Characters Read: $len Fblocked: $bl"

  if {$len < 0} {
     if {$bl} {
        puts "Input is blocked"
     } else {
        set connected 1
        puts "The socket was closed - closing my end"
        close $sock
     }
  } else {
     if {!$bl} {
        puts "Read $len characters: $line"
        catch {uplevel #0 $line} output
        puts "1==>$output<=="
        puts $sock "$output"
        puts $sock "\n"
        flush $sock
     }
  }
}

proc client { host port } {
  variable self
  set s [socket $host $port]
  set self(csock) $s
  set self($s,addr) $host
  set self($s,port) $port
  fconfigure $s -buffering line -blocking 0
  return $s
}

proc prun { sock args} {
  variable self
  set result [list]

  set cmd $args
  set cmd [regsub -all {(^\s*\{)||(\}\s*$)} $cmd ""]
  set cmd [string trimleft $cmd]
  set o1 [eval $cmd]
  #catch {uplevel #0 $cmd} o1

  puts "1_$sock ==> $o1"

  lappend result $o1
  #--------------
  puts $sock $cmd
  flush $sock

  set bl [fblocked $sock]

  set file [read $sock]
  set bl [fblocked $sock]
  puts "Fblocked: $bl"
  puts "Output: $file"

  puts "2_$Comm::self(csock) ==> $file ==> $bl"

  lappend result $file
  return $result
}
二,。 在客户端外壳上

$ set s [client $addr $port]
三,。 调用proc从客户机shell获取值,然后将命令发送到服务器以从服务器shell获取值,并将该值返回给客户机

$ set res [prun $s {set val [get_attribute [get_nets mynet] pin_capacitance_max]}]
你写道:

puts "2_$Comm::self(csock) ==> $file ==> $bl"
并使用变量定义自我。你在处理包裹吗?。可能是你忘了一些相关的东西


对于测试,您可以只使用全局,但使用数组会有点复杂。

有一件事我忘了提到。同一行代码“set file[read$sock]”在shell命令行上运行良好。但是,它在procI中从来都不起作用。我尝试通过测试“fblocked$sock”进行调试,在到达提到的“set file[read$sock]”之前,它都是0。然后它变成0。我不知道是什么原因导致这行代码将套接字变成阻塞。您给了我们一些过程,但没有调用它们的代码。这些位是如何结合在一起的?嗨,Donal Fellows,要运行的代码如下。我已经在第653页的《Tcl和Tk中的实用编程》一书中找到了我想要的东西。谢谢guysHi Alejandro,我也试过了。它不起作用了。我一直在尝试我能想到的所有可能的事情,但仍然不起作用。我认为我从根本上做错了什么。只是不知道你看起来像什么:或者?嗨,亚历杭德罗,就像我刚才提到的。命令“read$sock”在shell上工作,但当我将其放入proc时,它不工作。
puts "2_$Comm::self(csock) ==> $file ==> $bl"