Estou encontrando alguns daemons LPD de impressora que funcionam bem se a nova linha for enviada no mesmo pacote que o comando, mas quebre se a nova linha for enviada em um pacote separado. Isso é um bug nesses daemons em particular?
O protocolo LPD é dirigido por comandos de uma linha terminados com nova linha. De RFC 1179 :
A line printer daemon responds to commands send to its port. All commands begin with a single octet code, which is a binary number which represents the requested function. The code is immediately followed by the ASCII name of the printer queue name on which the function is to be performed. If there are other operands to the command, they are separated from the printer queue name with white space (ASCII space, horizontal tab, vertical tab, and form feed). The end of the command is indicated with an ASCII line feed character.
Este código Ruby estava sendo usado para enviar um comando:
socket.puts command
Internamente, o Ruby trata isso como duas gravações de soquete separadas
socket.print command
socket.print "\n"
O que pode ocasionalmente fazer com que dois pacotes sejam enviados, um do comando e outro para a nova linha. Isso não parece consistente com o Algoritmo de Nagle , pelo que entendi, mas verifiquei com o tcpdump que está de fato acontecendo. Quando o comando e a nova linha são enviados separadamente, alguns daemons LPD não aceitam o trabalho de impressão, mas, em vez disso, desconectam ou respondem ao comando com algo diferente de \ 0 (um ACK, de acordo com o RFC).
Se eu alterar este código para:
socket.print command + "\n"
para que o comando e sua nova linha sejam sempre enviados juntos, esses daemons funcionam bem.
Os daemons LPD com esse comportamento estão em impressoras, com tamanhos que variam de desktop a chão de fábrica. Eu não tenho acesso aos logs do daemon LPD, ou os registros não revelam nada. As impressoras são em sua maioria opacas para mim; Tenho acesso limitado ou nenhum acesso ao LPD na impressora (nem sei qual é o daemon LPD em execução em cada impressora).
Nem todos os daemons LPD são afetados por esse comportamento. Por exemplo, imprimir no daemon do LPRNG, ou CUPs, funciona bem mesmo quando novas linhas são enviadas em um pacote separado.
É um bug, ou há algo sobre TCP / IP ou o protocolo LPD que estou perdendo?