Сокет TCL сообщает о разрыве канала при записи с сервера - PullRequest
0 голосов
/ 11 марта 2019

При попытке вернуть многострочный вывод через сервер 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 -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"

Есть ли что-то очевидное, что яотсутствует

1 Ответ

2 голосов
/ 12 марта 2019

Условие [eof $sock] не установлено до чтения в [gets $sock line], и вызов [gets] не возвращает здесь ошибку, он возвращает -1, чтобы указать, что нет доступных данных.Просто измените порядок условий и сервер начнет работать правильно:

...
if { [catch {gets $sock line}] || [eof $sock] } {
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...