读取套接字被阻止

时间:2018-07-19 00:13:14

标签: tcl

我正在编写一个套接字实用程序,以将客户端与服务器进行通信。当从客户端输入套接字时,服务器可以正常接收它。但是,当从服务器向套接字输入时,客户端无法读取。在检查fchanneled $ channel时。是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
}

这是我的运行方式。

  1. 我在终端1上呼叫服务器。它将回显IP地址和端口。

  2. 然后我使用上面的地址和端口呼叫客户端,以获取客户端套接字

  3. 然后,我在客户端外壳上调用prun以获取一对值,一个值包含客户端上cmd调用的值,另一个包含服务器上cmd调用的值。基本上,我想获取一对值,以便可以将它们用于两组数据之间的关联。

下面是代码: 1。 在服务器外壳上

$ server

2。 在客户端外壳上

$ set s [client $addr $port]

3。 调用proc从客户端外壳获取值,然后将命令发送到服务器以从服务器外壳获取值,然后将该值返回给客户端。

$ set res [prun $s {set val [get_attribute [get_nets mynet] pin_capacitance_max]}]

1 个答案:

答案 0 :(得分:1)

您写道:

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

,并用变量定义 self 。您在使用软件包吗?可能是您忘记了与此有关的东西。

为了进行测试,您只能使用 global ,但是使用数组会稍微复杂一些。