Есть принтер Epson Stylus Pro 4450, нужно написать для него драйвер для печати по сети из-под своей ОС. Принтер поддерживает LPD и RAW, командный язык ESC/P.
Т.к. наша ОС не поддерживает RAW-сокеты, остаётся использовать его встроенный LPD сервер.
Спецификация на LPD тут
Я правильно понимаю, вначале нужно дать команду Receive a printer job, затем Receive control file, потом передать управляющий файл, затем дать команду Receive data file, далее передать файл с данными и после команды Print any waiting jobs принтер должен начать печатать?
И ещё, управляющий символ ESC/P можно передать, если указать в конфигурационном файле команду l?
Фрагмент кода, что-то не работает.
char outbuf[1024];
char inbuf[1024];
//команда Receive a printer job
outbuf[0]=2;
strcpy(outbuf+1,"PASSTHRU");
outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf1=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);
//команда Receive control file
outbuf[0]=2;
outbuf[1]=11;
outbuf[2]=' ';
strcpy(outbuf+3,"cfA00190.0.0.23");//IP клиента 90.0.0.23
outbuf[18]=0x0a;
send(sockClient, outbuf, 19, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf2=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);
//формируем и передаём управляющий файл
outbuf[0]='H';
strcpy(outbuf+1,"90.0.0.23");
outbuf[10]=0x0a;
outbuf[11]='P';
strcpy(outbuf+12,"root");
outbuf[16]=0x0a;
outbuf[17]='f';
strcpy(outbuf+18,"cfA00190.0.0.23");
outbuf[33]=0x0a;
outbuf[34]=0;
send(sockClient, outbuf, 35, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf3=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);
//команда Receive data file
outbuf[0]=3;
outbuf[1]=11;
outbuf[2]=' ';
strcpy(outbuf+3,"dfA00190.0.0.23");
outbuf[18]=0x0a;
send(sockClient, outbuf, 19, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf4=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);
//формируем и передаём файл с данными
strcpy(outbuf,"proverka");
//outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf5=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);
//команда Print any waiting jobs
outbuf[0]=1;
strcpy(outbuf+1,"PASSTHRU");
outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);