2009-10-07 3 views
2

Я делаю sysread в Perl 5.8.2 на AIX 5.3. Согласно документации, sysread должен дать 0, когда он прочитал все прочитанные из дескриптора файла.Почему мой блок sysread Perl при чтении из сокета?

В моем сценарии дескриптор файла STDIN и указывает на сокет. Поэтому я в основном делаю sysread из сокета. Но я никогда не получаю 0 от sysread, и он просто блокирует, даже после того, как клиент отправил все данные.

Любая идея, что может быть неправильным?

Спасибо.

ответ

5

Что значит «отправленные все данные»? sysread возвращает ноль, когда ручка сталкивается с условием конца файла, а не когда данных больше нет прямо сейчас. Для сокета EOF при чтении происходит, когда другая сторона отключает сокет для записи. (Ну, и sysread также будет возвращать undef, который численно равен нулю, если происходит ошибка, например, как сетевой тайм-аут.)

+0

я sysread в цикле в то время как для чтения данных из сокета .. но он продолжает блокировки, даже после того, как мой клиент отправил все данные .. sysread только блоки .. – someguy

+0

Да, вы уже сказали, что. – hobbs

+2

Ваш клиент явно не закрывает дескриптор выходного файла, 'sysread()' не является экстрасенсом. – Hasturkun

2

Отъезд select команды (один с 4 аргументами). Он может сообщить вам , есть ли какой-либо ввод, который будет читаться на вашем дескрипторе файла.

Смежные вопросы