2014-09-17 5 views
0

Im utilisant des flux d'entrée pour communiquer avec un périphérique POS. Lorsque j'envoie la première requête, la réponse est normale. Le problème vient quand j'envoie la deuxième demande parce que la deuxième réponse est plus courte que la première et que le contenu est toujours dans le flux. Donc, je reçois les éléments suivants:Lecture des ordures à partir de NSInputStream

Première réponse:

<response>A really big response with much more things inside</response> 

Deuxième réponse;

<response>A not so big response</response>more things inside</response> 

Je fais ce qui suit:

1) Ouvrez les flux

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, [port intValue], &readStream, &writeStream); 
iStream = (NSInputStream *)readStream; 
oStream = (NSOutputStream *)writeStream; 
[iStream setDelegate:self]; 
[oStream setDelegate:self]; 
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[iStream open]; 
[oStream open]; 

2) alors j'écris ma demande:

[oStream write:(uint8_t *)[request UTF8String] maxLength:[request length]]; 

3) lorsque la réponse arrive i capturez-le et envoyez-le à l'analyseur:

uint8_t buffer[MAX_BUFFER_SIZE]; 
[iStream read:buffer maxLength:MAX_BUFFER_SIZE - 1]; 
NSString *response = [NSString stringWithUTF8String:(char *)buffer]; 
free(buffer); 

NSError *error; 
NSDictionary *ret =[SimpleXMLConverter dictionaryForXMLString:response error:&error]; 

Après cela, j'ai essayé de fermer les cours d'eau et les ouvrir à nouveau avant d'envoyer la deuxième demande

Merci et salutations

PS: ne est pas un problème de blocage parce que je peux obtenir la sous-chaîne correcte, mais Je ne comprends pas pourquoi cela se produit

+0

Pourriez-vous montrer votre code? – Larme

+0

@Larme sûr. 1 seconde, je vais éditer le poste –

+0

@ Larme déjà édité –

Répondre

0

C'est parce que votre chaîne buffer n'est pas terminée \0 (NULL). Peut-être que uint8_t buffer[MAX_BUFFER_SIZE] = {0}; va résoudre votre problème actuel.

Cependant, vous devriez considérer qu'une réponse pourrait être plus longue que MAX_BUFFER_SIZE - 1. Même si une réponse est plus courte que celle-ci, il n'est pas garanti que read:maxLength: lira toutes les données à la fois. Vous devez vérifier la valeur renvoyée et les données reçues ont une réponse complète.

En outre, NE PAS free(buffer), car free() est seulement pour malloc() ed mémoire, pas pour les variables auto.

+0

youre complètement à droite. Je vous remercie! –

Questions connexes