我遇到了一些打印机 LPD 守护进程,如果换行符与命令在同一个数据包中发送,则它们工作正常,但如果换行符在单独的数据包中发送,则它们会中断。这是这些特定守护进程中的错误吗?
LPD 协议由以换行符结尾的单行命令驱动。RFC 1179:
行式打印机守护程序响应发送到其端口的命令。所有命令都以单个八位字节代码开头,该代码是代表所请求功能的二进制数。代码后面紧跟着要执行该功能的打印机队列名称的 ASCII 名称。如果命令还有其他操作数,则用空格(ASCII 空格、水平制表符、垂直制表符和换页符)将它们与打印机队列名称分隔开。命令的结尾用 ASCII 换行符表示。
该 Ruby 代码用于发送这样的命令:
socket.puts command
在内部,Ruby 将此视为两个单独的套接字写入
socket.print command
socket.print "\n"
这有时会导致发送两个数据包,一个是命令,另一个是换行符。这似乎与Nagle 算法,据我所知,但我已使用 tcpdump 验证了确实发生了这种情况。当命令和换行符单独发送时,某些 LPD 守护进程不会接受打印作业,而是断开连接,或使用 \0 以外的其他内容(根据 RFC,为 ACK)响应命令。
如果我将此代码更改为:
socket.print command + "\n"
这样命令和它的新行总是一起发送,这些守护进程就可以正常工作。
具有这种行为的 LPD 守护进程存在于打印机中,其大小从台式机到工厂车间不等。我要么无法访问它们的 LPD 守护进程日志,要么日志中没有显示任何内容。打印机对我来说大多是不透明的;我对打印机上的 LPD 的访问要么有限,要么根本无法访问(我甚至不知道每台打印机上运行的 LPD 守护进程是什么)。
并非所有 LPD 守护进程都会受到此行为的影响。例如,即使换行符在单独的数据包中发送,打印到 LPRNG 的守护进程或 CUP 也能正常工作。
这是一个错误,还是我遗漏了有关 TCP/IP 或 LPD 协议的某些信息?