Назад | Перейти на главную страницу

Демон lpd принтера отклоняет задание на печать, если новая строка команды отправляется отдельно - ошибка?

Я сталкиваюсь с некоторыми демонами LPD принтера, которые отлично работают, если новая строка отправляется в том же пакете, что и команда, но прерываются, если новая строка отправляется в отдельном пакете. Это ошибка именно этих демонов?

Протокол LPD управляется однострочными командами, оканчивающимися новой строкой. Из RFC 1179:

Демон построчного принтера реагирует на команды, отправленные на его порт. Все команды начинаются с одного октета кода, который представляет собой двоичное число, представляющее запрошенную функцию. Сразу за кодом следует имя ASCII имени очереди принтера, в которой должна выполняться функция. Если в команде есть другие операнды, они отделяются от имени очереди принтера пробелом (пробел ASCII, горизонтальная табуляция, вертикальная табуляция и подача страницы). Конец команды обозначается символом перевода строки ASCII.

Этот код Ruby использовался для отправки такой команды:

socket.puts command

Внутри Ruby обрабатывает это как две отдельные записи сокета

socket.print command
socket.print "\n"

Что иногда может привести к отправке двух пакетов, одного из команд и одного для новой строки. Это не похоже на Алгоритм Нэгла, насколько я понимаю, но я проверил с помощью tcpdump, что это действительно происходит. Когда команда и новая строка отправляются отдельно, некоторые демоны LPD не принимают задание печати, а вместо этого либо отключаются, либо отвечают на команду чем-то другим, кроме \ 0 (ACK, согласно RFC).

Если я изменю этот код на:

socket.print command + "\n"

так что команда и ее новая строка всегда отправляются вместе, эти демоны работают нормально.

Демоны LPD с таким поведением находятся в принтерах с размерами от настольных до заводских. У меня либо нет доступа к их журналам демона LPD, либо журналы ничего не показывают. Для меня принтеры в основном непрозрачны; У меня либо ограничен, либо нет доступа к LPD на принтере (я даже не знаю, какой демон LPD работает на каждом принтере).

Это поведение влияет не на всех демонов LPD. Например, печать в демон LPRNG или CUP работает нормально, даже когда новые строки отправляются в отдельном пакете.

Это ошибка, или мне что-то не хватает в TCP / IP или протоколе LPD?