2013-09-09 4 views
4

У меня есть рабочий код, который отправляет необработанные данные на принтер, записывая временный файл, а затем используя File.Copy(), чтобы отправить его на принтер. File.Copy() поддерживает оба локальных порта, такие как LPT1 и общие принтеры, такие как \\FRONTCOUNTER\LabelPrinter.Отправлять текстовый файл непосредственно сетевому принтеру

Однако теперь я пытаюсь заставить его работать с принтером, который находится непосредственно в сети: 192.168.2.100, и я не могу понять, какой формат использовать.

File.Copy(filename, @"LPT1", true); // Works, on the FRONTCOUNTER computer 
File.Copy(filename, @"\\FRONTCOUNTER\LabelPrinter", true); // Works from any computer 
File.Copy(filename, @"\\192.168.2.100", true); // New printer, Does not work 

Я знаю, что это возможно «Добавить принтер» с каждого компьютера, но я надеюсь, чтобы избежать этого - вторая строка кода выше работает с любого компьютера в сети автоматически, без каких-либо настроек. Я также знаю, что возможно P/Invoke для диспетчера очереди печати Windows, и если это мой единственный вариант, я могу его принять, но это намного больше накладных расходов кода, чем я хотел бы иметь.

В идеале у кого-то будет либо способ сделать работу File.Copy(), либо аналогичный оператор C#, который примет сетевой IP-адрес.

+0

установить его в Windows, как локальный принтер, а на интерфейсе TCP. Извините за неполное описание, я сделал это один раз и довольно долгое время. Вы можете спросить об этом на SuperUser. – ppeterka

+0

@ ppeterka66 - Я надеюсь избежать необходимости настраивать каждый компьютер. Я добавлю это к вопросу. – Bobson

+0

Вам не нужно указывать имя принтера после IP-адреса? Подобно '@" \\ 192.168.2.100 \ LabelPrinter ", если это ваш принтер для этикеток. –

ответ

16

Вы можете использовать сокеты и отправлять данные прямо на этот IP-адрес. В значительной степени это будет то же самое, что и File.Copy. Я просто попробовал, и это сработало.

Я просто послал текст, но вот код, который я использовал

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
clientSocket.NoDelay = true; 

IPAddress ip = IPAddress.Parse("192.168.192.6"); 
IPEndPoint ipep = new IPEndPoint(ip, 9100); 
clientSocket.Connect(ipep); 

byte[] fileBytes = File.ReadAllBytes("test.txt"); 

clientSocket.Send(fileBytes); 
clientSocket.Close(); 
+0

Я взял несколько ярлыков в своем собственном коде (например, '.SendFile()'), но это делает именно то, что я хочу. Я могу прочитать IP-адрес из базы данных, а все остальное работает точно так же, как и в текущем коде. Благодаря! – Bobson

+0

Это не работает для меня. Я не получаю никаких исключений (например, сервер отказался от соединения). Просто нет печатного материала. –

+0

Не могли бы вы рассказать мне, как распечатать файл отчета Crystal? –