Я сталкиваюсь с некоторыми демонами 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?