2016-07-22 4 views
0

J'ai besoin de développer une passerelle Internet Printing Protocol dans .Net qui recevra les travaux d'impression tirés d'IOS en utilisant le client AirPrint. La passerelle recevra le document déclenché et le relâchera dans la file d'attente d'impression. Je suis capable de diffuser mes services d'impression en utilisant le SDK fourni par Apple. Cependant, lorsque j'écoute sur un port pour recevoir des flux réseau d'un document, je ne suis pas en mesure de détecter la fin du flux reçu car le client continue d'envoyer des flux. Je suppose que nous devons lire les attributs et répondre en conséquence, mais je n'ai aucune idée de ces attributs. Voici le code que je suis actuellement en utilisant:Comment implémenter la passerelle IPP en utilisant 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); 
} 

Répondre

0

Vous devriez vérifier la stream.Read pour la valeur de retour. Si elle ne vous zéro les octets entrants du TcpClient:

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

À partir du client IPP, il continue à envoyer le flux d'en-tête et aucune donnée jusqu'à ce qu'il obtienne une réponse. Je voulais savoir si je pouvais détecter la fin des données et ensuite envoyer la réponse attendue au client. – Saket

+0

Si je vous ai bien compris, vous devriez vérifier les octets reçus (les convertir en chaîne) et si vous avez reçu la valeur attendue de 'TcpClient', envoyez votre réponse avec' stream.Write'. Vous pouvez aussi analyser un serveur/client IPP avec des outils d'analyse comme 'Wireshark' pour une meilleure compréhension de ce que vous devez recevoir/répondre de/vers le client. – Milad

+0

Vous l'avez bien compris, mais je n'ai pas de spécification pour l'impression aérienne, c'est pourquoi je ne sais pas quelles valeurs écrire pour streamer. J'ai cherché dans RFC et en ai trouvé un comme indiqué ci-dessus dans la chaîne "Continue", mais cela ne m'a pas beaucoup aidé. – Saket

0

Vous devez comprendre le niveau de communication. Vous n'êtes même pas encore en train de lire ou d'écrire des messages IPP appropriés. 100 continue est purley HTTP lié.

Même si les spécifications d'Apple pour AirPrint ne sont pas accessibles au public, il y a encore beaucoup d'informations en ligne. En bref: AirPrint est basé sur IPP. En ce qui concerne le PDL PDF pris en charge est un bon choix, mais pas le seul. iOS vérifie d'abord les capacités des imprimantes. C'est à vous de choisir le type de serveur d'impression (virtuel) que vous proposez.

(Si vous avez un cas d'affaires et avez besoin d'un développeur à distance, ne hestitate pas à nous contacter.)