Это служит для модуля указанием, что ввод-вывод в любом из этих объектов больше не будет выполняться. Однако основополагающие дескрипторы файлов не закрываются до тех пор, пока при последующих вызовах метода wait () не будут переданы все данные, поставленные в очередь. Обратите внимание, что для записи в дескриптор файла $stdout применяется следующая общая схема:
$stdout->write ($data) ,if $bytes > 0;
Это связано с тем, что метод $connection->read () может вернуть значение 0Е0 для указания на ошибку ewouldblock. В этом случае буфер $data не будет содержать новых данных, поэтому не нужно пытаться их записывать. С этой ситуацией позволяет справиться операция числового сравнения. Подобные схемы очень полезны для реализации новых бизнес идей сетевой тематики с применением оптимальных режимов.
Строки 36-42. Копирование данных из стандартного ввода в сокет. Если готовый дескриптор файла, возвращенный методом wait (), представляет собой объект IO::SessionData типа $stdin, то предпринимается попытка считать из него некоторые данные и записать их в сокет. Однако если метод read() возвращает ложный результат, это значит, что дескриптор STDIN закрыт. В ответ на это вызывается метод shutdown () сокета для закрытия записывающей стороны соединения. Это приводит к тому, что удаленный сервер обнаруживает признак конца файла и закрывает свой конец соединения, поэтому при следующем проходе по циклу метод $connection->read () возвращает ложный результат. Такой подход аналогичен применяемому в предыдущих версиях этого клиента.
Эта версия клиента gab имеет длину 45 строк, тогда как мультипроцессная версия, - 28 строк, а многопоточная - 27 строк. Может создаться впечатление, что эта версия не намного сложнее предыдущих, но нужно учитывать, что для ее поддержки применяется еще примерно 300 строк кода модулей IO::SessionData и IO::SessionSet!