Лекция: Принтеры с сетевыми интерфейсами

Часто при покупке сетевой карты для принтера можно приобрести две версии: эмулирующую спулер (более дорогая версия) или просто позволяющую принимать на принтер данные так, как если бы использовался последовательный или параллельный порт (более дешевая версия). В этом разделе описано, как использовать более дешёвую версию. Использование более дорогой версии описано в предыдущем разделе Принтеры, установленные на удаленных хостах.

Формат файла /etc/printcap позволяет указывать, какой последовательный или параллельный интерфейс использовать, и (при использовании последовательного интерфейса), какую установить скорость, использовать ли управление потоком, размер отступов для табуляций, преобразование символов новой строки и другие параметры. Но нет способа указать подключение к принтеру, прослушивающему TCP/IP или другой сетевой порт.

Для посылки данных на подключенный к сети принтер, надо разработать программу взаимодействия, которую могут вызывать текстовый фильтр и фильтры преобразований. Вот один из примеров: скрипт netprint принимает все данные со стандартного входного потока и посылает их на принтер, подключенный к сети. Мы указываем имя хоста принтера в качестве первого аргумента, а номер порта, к которому надо подключаться — в качестве второго аргумента команды netprint. Учтите, что поддерживается только одностороннее взаимодействие (с ОС FreeBSD на принтер); многие сетевые принтеры поддерживают двустороннее взаимодействие, и вы можете захотеть его использовать (для получения состояния принтера, учета и т.п.).

#!/usr/bin/perl

#

# netprint — Текстовый фильтр для принтера, подключенного к сети

# Установлен в /usr/local/libexec/netprint

#

$#ARGV eq 1 || die «Usage: $0 <printer-hostname> <port-number>»;

 

$printer_host = $ARGV[0];

$printer_port = $ARGV[1];

 

require 'sys/socket.ph';

 

($ignore, $ignore, $protocol) = getprotobyname('tcp');

($ignore, $ignore, $ignore, $ignore, $address)

= gethostbyname($printer_host);

 

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

 

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)

|| die «Can't create TCP/IP stream socket: $!»;

connect(PRINTER, $sockaddr) || die «Can't contact $printer_host: $!»;

while (<STDIN>) { print PRINTER; }

exit 0;

Затем можно использовать этот сценарий в различных фильтрах. Пусть у нас есть строчный принтер Diablo 750-N, подключенный к сети. Принтер принимает данные на печать через порт 5100. Имя хоста для принтера — scrivener. Вот текстовый фильтр для этого принтера:

#!/bin/sh

#

# diablo-if-net — Текстовый фильтр для принтера Diablo `scrivener',

# прослушивающего порт 5100. Установлен в /usr/local/libexec/diablo-if-net

#

exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100

еще рефераты
Еще работы по информатике