从NSInputStream读取垃圾

时间:2014-09-17 10:26:06

标签: ios buffer inputstream

我正在使用输入流与POS设备进行通信。

当我发送第一个请求时,响应正常。问题出现在我发送第二个请求时,因为第二个响应比第一个响应短,并且内容仍在流中。所以我得到以下内容:

第一反应:

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

第二次回应;

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

我执行以下操作:

1)打开流

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)然后我写了我的请求:

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

3)当响应到达时,我捕获它并将其发送给解析器:

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];

在此之后,我尝试关闭流并在发送第二个请求之前再次打开它们

谢谢和问候

PS:它不是阻塞问题,因为我可以获得正确的子串,但我不明白为什么会发生这种情况

1 个答案:

答案 0 :(得分:0)

那是因为你的buffer字符串不是\0(NULL)终止。 也许uint8_t buffer[MAX_BUFFER_SIZE] = {0};会解决您当前的问题。

但是,您应该考虑一个响应可能比MAX_BUFFER_SIZE - 1更长。 即使响应时间比它短,也不能保证read:maxLength:一次读取所有数据。您必须检查返回的值,并且接收的数据具有完整响应。

此外,请勿free(buffer),因为free()仅适用于malloc()内存,不适用于自动变量。