TCL套接字在从服务器写入时报告管道断开
当尝试通过TCL服务器返回多行输出时,即使客户端能够接收所有数据,服务器也会报告管道断开 服务器:TCL套接字在从服务器写入时报告管道断开,tcl,Tcl,当尝试通过TCL服务器返回多行输出时,即使客户端能够接收所有数据,服务器也会报告管道断开 服务器: proc Echo_Server {port} { set s [socket -server EchoAccept $port] vwait forever } proc EchoAccept {sock addr port} { puts "Accept $sock from $addr port $port" fconfigure $sock -buffer
proc Echo_Server {port} {
set s [socket -server EchoAccept $port]
vwait forever
}
proc EchoAccept {sock addr port} {
puts "Accept $sock from $addr port $port"
fconfigure $sock -buffering line
fileevent $sock readable [list Echo $sock]
}
proc Echo {sock} {
if { [eof $sock] || [catch {gets $sock line}] } {
puts "Close $sock"
close $sock
} else {
set returnData "
Hi
How are you?
This is test data
Close
"
puts $sock $returnData
puts $sock "EOF"
flush $sock
}
}
Echo_Server 2500
vwait forever
发送/接收数据的客户端代码:
proc Echo_Client {host port} {
set s [socket $host $port]
fconfigure $s -buffering full -buffersize 1000000
#fconfigure $s -buffering line -blocking 0
return $s
}
set s [Echo_Client localhost 2500] ; puts $s "dummy command" ; flush $s
set pp 1 ; while { $pp == 1 } { set line [gets $s] ; puts $line ; if { [regexp "EOF" $line] } { set pp 0 } } ; flush $s ; close $s
客户端接收从服务器发送的数据,但服务器报告以下内容:
% source /edascratch/nobackup/sanjaynn/scripts/simple_server.tcl
Accept sock6 from 127.0.0.1 port 59814
error writing "sock6": broken pipe
while executing
"puts $sock $returnData"
(procedure "Echo" line 15)
invoked from within
"Echo sock6"
有什么明显的遗漏吗?在读入
[get$sock line]
之前没有设置[eof$sock]
条件,并且[get]
调用在这里不返回错误,它返回-1
以指示没有可用数据。只要颠倒条件顺序,服务器将开始正常工作:
...
if { [catch {gets $sock line}] || [eof $sock] } {
...
[eof$sock]
条件未在读入[gets$sock line]
之前设置,并且[gets]
调用在此处不返回错误,它返回-1
以指示没有可用数据。只要颠倒条件顺序,服务器将开始正常工作:
...
if { [catch {gets $sock line}] || [eof $sock] } {
...