如何使用C#实现IPP网关?

时间:2016-07-22 07:49:18

标签: c# tcp bonjour airprint

我需要在.Net中开发一个Internet打印协议网关,它将接收使用AirPrint客户端从IOS发出的打印作业。网关将接收触发的文档并将其释放到打印队列。我可以使用Apple提供的SDK广播我的打印服务。但是,当我在端口上侦听接收文档的网络流时,由于客户端继续发送流,我无法检测到收到的流的结尾。我的猜测是我们必须阅读属性并做出相应的响应,但我不知道这些属性。以下是我目前使用的代码:

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);
}

2 个答案:

答案 0 :(得分:0)

您应该检查stream.Read的返回值。 如果它不为零,则您有来自TcpClient的传入字节:

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

答案 1 :(得分:0)

您需要了解沟通的级别。您甚至还没有阅读或编写正确的IPP消息。 100继续与purley HTTP相关。

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

(如果您有商业案例并需要远程开发人员,请不要犹豫与我们联系。)