我正在编写一个套接字实用程序,以将客户端与服务器进行通信。当从客户端输入套接字时,服务器可以正常接收它。但是,当从服务器向套接字输入时,客户端无法读取。在检查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上呼叫服务器。它将回显IP地址和端口。
然后我使用上面的地址和端口呼叫客户端,以获取客户端套接字
然后,我在客户端外壳上调用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]}]
答案 0 :(得分:1)
您写道:
puts "2_$Comm::self(csock) ==> $file ==> $bl"
,并用变量定义 self 。您在使用软件包吗?可能是您忘记了与此有关的东西。
为了进行测试,您只能使用 global ,但是使用数组会稍微复杂一些。