2016-07-22 4 views
0

Мне нужно разработать шлюз протокола интернет-печати в .Net, который получит задания печати, запущенные из IOS, с использованием клиента AirPrint. Шлюз будет получать документ и отпустить его в очередь печати. Я могу транслировать свои службы печати, используя SDK от Apple. Однако, когда я слушаю порт, чтобы получать сетевые потоки документа, я не могу обнаружить конец потока, полученный, когда клиент продолжает отправлять потоки. Я предполагаю, что мы должны прочитать атрибуты и ответить соответственно, но я не знаю этих атрибутов. Ниже приведен код, который я в настоящее время с помощью:Как реализовать шлюз IPP с помощью C#?

IPAddress ipAddress = IPAddress.Parse("10.0.0.13"); 
IPAddress tcpListener = new TcpListener(ipAddress, 631); 
tcpListener.Start(); 
while (true) 
{ 
TcpClient tcpClient = tcpListener.AcceptTcpClient(); 
byte[] bytes = new byte[2560]; 
NetworkStream stream = tcpClient.GetStream(); 

stream.Read(bytes, 0, bytes.Length); 
string mstrMessage = Encoding.ASCII.GetString(bytesReceived, 0, bytesReceived.Length); 

string Continue = "HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nDate: " + dateTime + "\r\nPragma: no-cache\r\nTransfer-Encoding: chunked\r\nContent-Type: application/ipp\r\n\r\nattributes-charset utf-8 attributes-natural-language en-us compression-supported none printer-is-accepting-jobs true document-format-supported application/pdf\r\n\r\n0\r\n"; 

bytesSent = Encoding.ASCII.GetBytes(mstrResponse); 

stream.Write(bytesSent, 0, bytesSent.Length); 
} 

ответ

0

Вы должны проверить stream.Read для возвращения значения. Если это не ноль у вас есть входящие байты из TcpClient:

var bytesLength = 0; 
do 
{ 
    bytesLength = stream.Read(bytes, 0, bytes.Length); 
    if (bytesLength == 0) return; 
} 
while(bytesLength > 0); 
+0

От клиента IPP, он продолжает посылать поток с заголовком и никаких данных, пока не получит какое-либо ответ. Я хотел знать, могу ли я обнаружить конец данных, а затем отправить ответ, ожидаемый клиенту. – Saket

+0

Если я четко понял вас, вы должны проверить полученные байты (преобразовать их в строку), и если вы получили ожидаемое значение из 'TcpClient', отправьте свой ответ с помощью' stream.Write'. Также вы можете проанализировать IPP-сервер/клиент с помощью инструментов анализатора, таких как «Wireshark», для лучшего понимания того, что вы должны получать/отвечать от клиента. – Milad

+0

Вы поняли это правильно, но у меня нет спецификаций для печати, поэтому я не знаю, какие значения нужно писать в поток. Я искал в RFC и нашел один, как показано выше, в строке «Продолжить», но это не очень помогает. – Saket

0

Вы должны понимать уровень общения. Вы даже не читаете или не пишете правильные сообщения IPP. 100 продолжить - это связанный с HTTP-сетью HTTP-код.

Даже если яблоки Spec для AirPrint не является общедоступной, есть еще много информации в Интернете. Вкратце: AirPrint основан на IPP. Что касается поддерживаемого PDL PDF, это хороший выбор, но не единственный. Сначала iOS проверяет возможности принтеров. Это зависит от вас, какой (виртуальный) сервер печати вы предлагаете.

(В случае, если у вас есть бизнес-кейс и требуют удаленного разработчика, не могут связаться с нами.)