2016-07-22 100 views
0

我需要在.Net中开发一个Internet打印协议网关,它将接收使用AirPrint客户端从IOS触发的打印作业。网关将接收文件并将其发布到打印队列中。我可以使用Apple提供的SDK广播我的打印服务。但是,当我监听端口接收文档的网络流时,由于客户端始终在发送流,因此无法检测到接收到的流的结束。我的猜测是我们必须阅读属性并作出相应的回应,但我不知道这些属性。以下是我目前使用的代码:如何使用C#实现IPP网关?

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'发送你的响应。您还可以使用像Wireshark这样的分析工具来分析IPP服务器/客户端,以便更好地理解您必须从客户端接收/响应的女巫。 – Milad

+0

您的理解正确,但我没有airprinting的规格,这就是为什么我不知道要写入流的值。我在RFC中搜索,发现一个如上面的“继续”字符串中所示,但它不是很有帮助。 – Saket

0

你需要了解沟通的水平。你甚至没有阅读或编写适当的IPP消息。 100继续是purley HTTP相关。

尽管AirPrint的Apple规格尚未公开,但网上仍有大量信息。简而言之:AirPrint基于IPP。至于支持的PDL PDF是一个不错的选择,但不是唯一的选择。 iOS首先检查打印机功能。这取决于你提供什么样的(虚拟)打印服务器。

(如果你有一个商业案例,并要求其他开发人员,毫不犹豫与我们联系。)