2016-07-22 49 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首先檢查打印機功能。這取決於你提供什麼樣的(虛擬)打印服務器。

(如果你有一個商業案例,並要求其他開發人員,毫不猶豫與我們聯繫。)