[Ruby] чтение из сокета неопределенного количества строк

vic ismakaev viclists at mail.esoo.ru
Wed May 7 17:10:15 MSD 2003


7 Май 2003 18:32, Grigory Milev написал:
> >>>>> "vic" == vic ismakaev <viclists at mail.esoo.ru> writes:
>
>     vic> Приветсвую всех!  Я опять с тупым вопросом: как в цикле прочитать
> из vic> сокета неопределенного количество строк?  Например есть код вида
> vic> @s=TCPSocket.open('mail','110') p @s.readline("\n") @s.puts("user vic>
> test") p @s.readline("\n") @s.puts("pass 123") p @s.readline("\n") vic>
> @s.puts("stat") p @s.readline("\n") @s.puts("list") while vic>
> @s.readline.length > 0 line=@s.readline p line end Так вот - в vic>
> последнем цикле: останавливается на последней строке,прочитанной из vic>
> сокета и остается в таком состоянии,пока я его не прерву по vic>
> CTRL+C.После чего появляется ошибка типа ./pop.rb:11:in `readline': vic>
> Interrupt from ./pop.rb:11 И я никак не пойму,как отловить момент,что vic>
> строк из сокета больше не получишь и выйти из цикла.  По идее,в такой vic>
> конструкции цикла while он должен прерываться после последней строки vic> и
> вываливаться из цикла,но почему-то этого не происходит.
>
>     vic> Потому и вопрос - какого вида цикл мне нужно использовать?
> Проверяй на ! @s.eof
Увы.Но сервер не возвращает EOF при таких запросах.
Он просто гонит строки ,оканчивающиеся на "\r\n" либо "\n",либо не гонит 
ничего.
А я хочу сделать цикл,который вываливается ,если сервер не возвращает ничего.
То биш - 
<цикл>
сервер> пишет строку в сокет
клиент> читает строку и что-то с ней делает
сервер> не пишет строку в сокет(ничего не шлет)
клиент> вывалится из цикла
<конец цикла>

Насколько я понял - надо пользоваться неблокирующим чтением сокета.Но как это 
сделать - не пойму.:(
-- 
С уважением
Виктор В Исмакаев



More information about the Ruby mailing list